如何将sql聚合函数与不同更清晰的组合?

Tho*_*ton 1 sql sql-server distinct aggregate-functions

我最近一直在重复遇到以下情况,要么我需要将MAX()或SUM()应用于表中的一列,但我需要为其他列设置DISTINCT值.

例如,请考虑下表和关联列,这些列表示StackOverflow登录的详细信息.

SoUserLogins(OpenIdToken,Name,IpAdress,LoginTimeStamp,QuestionsAsked)

我可能想要一个包含用户及其上次登录的结果集.

SELECT DISTINCT
  OpenIdToken,
  MAX(LoginTimeStamp)
INTO #tmpLastLogin
FROM SoUserLogins
GROUP BY OpenIdToken
Run Code Online (Sandbox Code Playgroud)

但是我需要来自其他列的不同值.我将把它包装在一个公用表表达式(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
Run Code Online (Sandbox Code Playgroud)

您可以在上面的代码中将MAX(LoginTimeStamp)更改为SUM(QuestionsAsked),并进行一些额外的调整以查看类似的示例.

我的问题是,是否有更清洁或更优雅的方式来处理这些情况?

我正在使用SQL Server.

Mar*_*ith 7

你是说这个吗?

SELECT DISTINCT
  SOL.OpenIdToken, SOL.Name, SOL.IpAdress, SOL.QuestionsAsked,
  MAX(LoginTimeStamp) OVER (PARTITION BY OpenIdToken) AS LastLogin
FROM SoUserLogins SOL
Run Code Online (Sandbox Code Playgroud)

因此,每个行将有多个行,OpenIdToken并且LastLogin对于组中的所有行,将重复相同的值?