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.
你是说这个吗?
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对于组中的所有行,将重复相同的值?
| 归档时间: |
|
| 查看次数: |
4563 次 |
| 最近记录: |