如何用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
相关产品推荐
相关产品推荐

