You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于新生成的MAX()列执行GROUP BY操作

问题解决:按用户分组取最大Status值

数据表因输入失误,部分用户存在多个Status值,需要按用户分组取Status的最大值得到目标结果。已用窗口函数生成MaxStatus列,但无法基于该列执行GROUP BY(系统提示无效列名),不会用子查询实现,求解决办法。

原数据表

NameIDStatus
Roger Collins9043
Roger John Horspool9153
Roger John Shippey9323
Roger John Shippey & T.C. Rowell53412
Roger John Shippey & T.C. Rowell53413

目标结果表

NameIDMax_Status
Roger Collins9043
Roger John Horspool9153
Roger John Shippey9323
Roger John Shippey & T.C. Rowell53413

已尝试的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:56:10