在 SQL 中 DENSE_RANK() 的潜在用途

问题描述 投票:0回答:2

在 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
sql mysql ssms row-number dense-rank
2个回答
0
投票

这相当简单:使用运行总和,如果没有则递增(前一组= 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
一起用于对行进行分组。


0
投票
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;
© www.soinside.com 2019 - 2024. All rights reserved.