在 SQL 中,我正在寻找一个潜在的函数,每次满足特定条件时我都可以使用它来应用行号。
每次唯一 ID 相同(即同一个人)且
Dep_Group
为 WES
时,如果它们彼此连续,则为该行提供相同的编号。我想做的就是最终将这些行压缩成一行,希望通过在末尾添加 GROUP BY New_Col
子句来实现。所以本质上 Line
1 和 2 成为一行,Line
5 和 6.
|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 |
到目前为止,我的代码示例在 DENSE_RANK() 中并不能完全按照我想要的方式工作:
SELECT Line
,Uniq_ID
,Start_DT
,End_DT
,Sequence
,Department
,Dep_Group
,DENSE_RANK() OVER (PARTITION BY Uniq_ID, Dep_Group ORDER BY Sequence) AS New_Col
FROM TblA
这相当简单:使用运行总和,如果没有则递增(前一组= wes,当前组= wes):
with cte1 as (
select *
, case when lag(dep_group) over (partition by uniq_id order by sequence) = 'WES' and dep_group = 'WES' then 0 else 1 end as incr
from t
), cte2 as (
select *
, sum(incr) over (partition by uniq_id order by sequence) as grp_num
from cte1
)
select *
from cte2
这将为您提供以下结果:
线 | uniq_id | 开始_dt | 结束_dt | 顺序 | 部门 | dep_group | 增加 | grp_num |
---|---|---|---|---|---|---|---|---|
1 | 1 | 2023-01-02 | 2023-01-03 | 1 | WES | WES | 1 | 1 |
2 | 1 | 2023-01-02 | 2023-01-03 | 2 | WES | WES | 0 | 1 |
3 | 1 | 2023-01-02 | 2023-01-03 | 3 | DEM | 空 | 1 | 2 |
4 | 2 | 2023-01-02 | 2023-01-03 | 1 | WES | WES | 1 | 1 |
5 | 3 | 2023-01-02 | 2023-01-03 | 1 | WES | WES | 1 | 1 |
6 | 3 | 2023-01-02 | 2023-01-03 | 2 | WES | WES | 0 | 1 |
7 | 4 | 2023-01-02 | 2023-01-03 | 1 | DEM | 空 | 1 | 1 |
grp_num
列可与 uniq_id
一起用于对行进行分组。
SELECT Line,
Uniq_ID,
Start_DT,
End_DT,
Sequence,
Department,
Dep_Group,
SUM(Flag) OVER (PARTITION BY Uniq_ID ORDER BY Sequence) AS New_Col
FROM (
SELECT *,
IIF(LAG(Dep_Group) OVER (PARTITION BY Uniq_ID ORDER BY Sequence) = 'WES' AND Dep_Group = 'WES', 0, 1) AS Flag
FROM TblA
) AS subquery;