sql - 如何更干净地将 sql 聚合函数与 distinct 结合起来?

我最近反复遇到以下情况,我需要将 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/

相关文章:

module - Lua - 关于模块的问题

ruby-on-rails - Ruby on Rails 究竟是什么?

gcc - __builtin_expect 来自 GCC 的概率

vhdl - VHDL 中的通用移位算法

r - 为什么 nlogn 很难反转?

c++11 - 无法创建 Direct2D DXGI 表面

variables - Lua:为什么改变一个变量的值也会改变另一个变量的值?

image - 人体的宽度和高度

ajax - setInterval 不适用于 ajax 调用

iphone - 滚动时 UITableView 未正确更新