SQL按Id2分组新增Flag列 最小Id行赋0其余行赋1
需求实现方法
你之前用GROUP BY没成功是正常的:GROUP BY的逻辑是把同组多行数据聚合为单条结果,没法保留原表所有明细行,自然没法给每一行单独赋值标记。
通用写法(支持窗口函数的SQL环境:MySQL8.0+、PostgreSQL、SQL Server、Hive、SparkSQL等)
直接用窗口函数在不折叠行的前提下完成分组内最小值计算,写法最简洁:
SELECT Id, Prod, Id2, CASE WHEN Id = MIN(Id) OVER (PARTITION BY Id2) THEN 0 ELSE 1 END AS Flag FROM 你的表名;
核心逻辑:
- 用
PARTITION BY Id2指定按Id2字段分组,不折叠原表行 - 计算每个分组内的最小Id值
- 当前行Id等于组内最小Id时Flag赋值0,其余行赋值1
兼容老版本SQL的写法(比如MySQL5.x不支持窗口函数的场景)
先通过GROUP BY算出每个Id2组对应的最小Id,再和原表关联打标:
SELECT t1.Id, t1.Prod, t1.Id2, CASE WHEN t1.Id = t2.min_id THEN 0 ELSE 1 END AS Flag FROM 你的表名 t1 LEFT JOIN ( SELECT Id2, MIN(Id) AS min_id FROM 你的表名 GROUP BY Id2 ) t2 ON t1.Id2 = t2.Id2;
以上两种写法运行后的输出和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Fernando Quintino
相关产品推荐
相关产品推荐

