我最近一直在反复遇到以下情况,要么我需要将MAX()或SUM()应用于表中的一列,但我需要其他列的DISTINCT值集。
例如,请考虑下表和相关列,这些列表示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。
答案 0 :(得分:7)
你是说这个吗?
SELECT DISTINCT
SOL.OpenIdToken, SOL.Name, SOL.IpAdress, SOL.QuestionsAsked,
MAX(LoginTimeStamp) OVER (PARTITION BY OpenIdToken) AS LastLogin
FROM SoUserLogins SOL
因此,每个OpenIdToken
会有多行,并且对于组内的所有行,将重复相同的LastLogin
值吗?
答案 1 :(得分:0)