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

如何用SQL将分组内最大值对应的行标记为TRUE

解决按ID分组标记最大ORDER行的问题

你的原SQL之所以所有ACTIVE都返回TRUE,是因为GROUP BY同时包含了ID和ORDER,这会把每个ID+ORDER的组合作为独立分组,每个分组内的ORDER值唯一,因此MAX(ORDER)等于当前行的ORDER,导致所有行都被标记为TRUE,同时原SQL还遗漏了AGE字段,不符合需求。

最优解法:窗口函数

窗口函数是这类分组内逐行比较场景的最优方案,无需分组聚合就能计算出每个ID组的最大ORDER值,直接逐行判断:

SELECT 
    ID,
    "ORDER", -- ORDER是SQL关键字,需用引号包裹(不同数据库可能用`或"",如MySQL用`ORDER`)
    AGE,
    CASE WHEN "ORDER" = MAX("ORDER") OVER (PARTITION BY ID) 
         THEN TRUE 
         ELSE FALSE 
    END AS ACTIVE
FROM MY_TABLE;
  • MAX("ORDER") OVER (PARTITION BY ID):按ID分组,计算每个组内的最大ORDER值,该值会对应到该组的每一行
  • 用当前行的ORDER与组内最大值比较,相等则标记为TRUE,否则为FALSE
  • 保留原表所有行和AGE字段,完全匹配你期望的结果

兼容旧版数据库的方案(无窗口函数)

如果你的数据库不支持窗口函数(如MySQL 5.7及以前版本),可以用子查询关联的方式实现:

SELECT 
    t.ID,
    t."ORDER",
    t.AGE,
    CASE WHEN t."ORDER" = m.max_order THEN TRUE ELSE FALSE END AS ACTIVE
FROM MY_TABLE t
INNER JOIN (
    SELECT ID, MAX("ORDER") AS max_order
    FROM MY_TABLE
    GROUP BY ID
) m ON t.ID = m.ID;

内容的提问来源于stack exchange,提问作者Angie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:35:14