我最近反复遇到以下情况,我需要将 MAX() 或 SUM() 应用于表中的一列,但我需要为其他列设置不同的值集。
例如,请考虑下表和表示登录 StackOverflow 的详细信息的相关列。
SoUserLogins (OpenIdToken, Name, IpAdress, LoginTimeStamp, QuestionsAsked)
我可能想要一个包含用户及其上次登录的结果集。
SELECT DISTINCT
OpenIdToken,
MAX(LoginTimeStamp)
INTO #tmpLastLogin
FROM SoUserLogins
GROUP BY OpenIdToken
但我需要与其他列不同的值。我将把它包装在一个公用表表达式 (CTE) 中,因为我稍后会用到它并且不想清理另一个临时表。
;WITH tmpLastLogin_CTE AS (
SELECT DISTINCT
SOL.OpenIdToken, SOL.Name, SOL.IpAdress, SOL.QuestionsAsked
TTL.LastLogin
FROM SoUserLogins SOL
JOIN #tmpLastLogin TLL ON SOL.OpenIdToken = TLL.OpenIdToken
)
--Extra SQL using tmpLastLogin_CTE goes here
您可以将上面代码中的 MAX(LoginTimeStamp) 更改为 SUM(QuestionsAsked),并进行一些额外的调整以查看类似示例。
我的问题是,是否有更简洁或更优雅的方式来处理这些情况?
我正在使用 SQL Server。
最佳答案
你是这个意思吗?
SELECT DISTINCT
SOL.OpenIdToken, SOL.Name, SOL.IpAdress, SOL.QuestionsAsked,
MAX(LoginTimeStamp) OVER (PARTITION BY OpenIdToken) AS LastLogin
FROM SoUserLogins SOL
因此,每个 OpenIdToken
将有多个行,并且相同的 LastLogin
值将对组内的所有行重复?
https://stackoverflow.com/questions/3826459/