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

时间:2010-09-29 22:50:42

标签: 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

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

2 个答案:

答案 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)

如果您在 Oracle数据库下,则应考虑使用自定义 * Oracle分析功能 * 这可以让你根据列来按行收集数据。

当我写这篇文章时,马丁确实回答了。

但是可以找到一些文档here(法语)