如何基于新生成的MAX()列执行GROUP BY操作
问题解决:按用户分组取最大Status值
数据表因输入失误,部分用户存在多个Status值,需要按用户分组取Status的最大值得到目标结果。已用窗口函数生成MaxStatus列,但无法基于该列执行GROUP BY(系统提示无效列名),不会用子查询实现,求解决办法。
原数据表
| Name | ID | Status |
|---|---|---|
| Roger Collins | 904 | 3 |
| Roger John Horspool | 915 | 3 |
| Roger John Shippey | 932 | 3 |
| Roger John Shippey & T.C. Rowell | 5341 | 2 |
| Roger John Shippey & T.C. Rowell | 5341 | 3 |
目标结果表
| Name | ID | Max_Status |
|---|---|---|
| Roger Collins | 904 | 3 |
| Roger John Horspool | 915 | 3 |
| Roger John Shippey | 932 | 3 |
| Roger John Shippey & T.C. Rowell | 5341 | 3 |
已尝试的代码
SELECT Name, ID, Status, MAX(Status) OVER(PARTITION BY Name) AS MaxStatus FROM [dbo].[TaskStatus_View]
解决方案
方法一:直接GROUP BY(最简洁高效)
观察数据可知,每个Name对应唯一的ID,因此可以直接按Name和ID分组,聚合取Status的最大值:
SELECT Name, ID, MAX(Status) AS Max_Status FROM [dbo].[TaskStatus_View] GROUP BY Name, ID
方法二:基于窗口函数结果的子查询/CTE
如果一定要基于你生成的MaxStatus列处理,可以将窗口函数的查询作为子查询(或CTE),之后通过去重得到每组的结果:
子查询写法
SELECT DISTINCT Name, ID, MaxStatus AS Max_Status FROM ( SELECT Name, ID, Status, MAX(Status) OVER(PARTITION BY Name) AS MaxStatus FROM [dbo].[TaskStatus_View] ) AS SubQuery
CTE写法(可读性更高)
WITH StatusWithMax AS ( SELECT Name, ID, Status, MAX(Status) OVER(PARTITION BY Name) AS MaxStatus FROM [dbo].[TaskStatus_View] ) SELECT DISTINCT Name, ID, MaxStatus AS Max_Status FROM StatusWithMax
为什么之前不能直接GROUP BY MaxStatus?
SQL的执行顺序是:FROM/JOIN → WHERE → GROUP BY → 聚合函数 → HAVING → SELECT → ORDER BY。GROUP BY执行时,SELECT中定义的别名MaxStatus还未生效,因此无法直接用该别名进行分组。
内容的提问来源于stack exchange,提问作者Lord_Verulam
相关产品推荐
相关产品推荐

