SQL中利用DENSE_RANK()实现特定分组连续行统一编号需求
问题分析
你当前使用的DENSE_RANK()写法无法满足需求,原因是:该函数在PARTITION BY Uniq_ID, Dep_Group的分区内,会按Sequence排序生成不同的排名,导致同一Uniq_ID下的WES行(如Line1和Line2)得到不同的New_Col值,无法合并。
解决方案
采用岛屿分组的思路,通过判断每行是否为新组的起始行,再累计求和生成连续的组编号,实现同一Uniq_ID下连续的WES行分配相同编号的需求:
SELECT Line, Uniq_ID, Start_DT, End_DT, Sequence, Department, Dep_Group, SUM(is_new_group) OVER (ORDER BY Line) AS New_Col FROM ( SELECT *, CASE -- 当前行属于WES组,且与上一行是同一Uniq_ID的WES组 → 不属于新组 WHEN Dep_Group = 'WES' AND LAG(Uniq_ID) OVER (ORDER BY Line) = Uniq_ID AND LAG(Dep_Group) OVER (ORDER BY Line) = 'WES' THEN 0 -- 非WES行/新Uniq_ID的WES行 → 属于新组 ELSE 1 END AS is_new_group FROM TblA ) AS sub ORDER BY Line;
执行结果
该代码会生成你预期的结果:
| Line | Uniq_ID | Start_DT | End_DT | Sequence | Department | Dep_Group | New_Col |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 2023-01-02 | 2023-01-03 | 1 | WES | WES | 1 |
| 2 | 1 | 2023-01-02 | 2023-01-03 | 2 | WES | WES | 1 |
| 3 | 1 | 2023-01-02 | 2023-01-03 | 3 | DEM | NULL | 2 |
| 4 | 2 | 2023-01-02 | 2023-01-03 | 1 | WES | WES | 3 |
| 5 | 3 | 2023-01-02 | 2023-01-03 | 1 | WES | WES | 4 |
| 6 | 3 | 2023-01-02 | 2023-01-03 | 2 | WES | WES | 4 |
| 7 | 4 | 2023-01-02 | 2023-01-03 | 1 | DEM | NULL | 5 |
内容的提问来源于stack exchange,提问作者Sunny0101
相关产品推荐
相关产品推荐

