我正在使用一些T-SQL代码来获取列[Num](在下面的示例表中(。基本上,我试图在[Type]的新序列开始时创建一个索引。
问:如何创建下面的[num]字段
[Num]是字段[Type]的顺序范围的顺序。您可以看到,从2022-01-01到2022-01-03[类型]="正在工作"。然后在2022-01-07,具有相同类型的新的顺序行范围开始(尽管只有一天(,因此为2。基本上,如果没有相同类型的连续天数,而另一天出现不同类型的天数,则范围停止。当新的一天以相同的类型开始时(>1天后(,新的范围开始。你可以假设在我的情况下,一天不可能有不同的类型。
让我感到棘手的是,我不能在Type上对它进行分区,因为它稍后会使用常规row_number在新序列中重复出现。
我需要这个的一些额外解释:我正在创建一个SCD维度,通过按[Type]分组的最小值和最大值,该维度具有有效的开始日期和有效的结束日期。但由于[Type]是重复出现的,所以这是不起作用的。我需要一种方法使[类型]的每个非连续序列都是唯一的。如果我的解决方案是次优的,我当然愿意接受其他建议。
表_1
日期 | 类型Num | |
---|---|---|
2022-01-01 | 工作 | 1 |
2022-01-02 | 工作 | 1|
2022-01-03 | 工作 | 1|
2022-01-04 | 休息 | 1 |
2022-01-05 | 休息 | 1|
2022-01-06 | 休息 | 1 |
2022-01-07 | 工作 | 2|
2022-01-08 | 休息 | 2 |
2022-01-09 | 休息 | 2 |
2022-01-10 | 休息 | 2 |
2022-01-1 | 休息 | 2 |
2022-012 | 休息 | 2 |
2022-012 | 旅行 | <1>|
2022-013 | 工作 | 3 |
2022-01-14 | 旅行 | 2 |
2022-015 | 工作 | 4|
2022-01-16 | 工作 | 4
这是一个典型的缺口和孤岛问题。找到你的岛屿,然后DENSE_RANK
它们:
WITH Grps AS(
SELECT V.Date,
V.Type,
V.Num,
ROW_NUMBER() OVER (ORDER BY V.Date) -
ROW_NUMBER() OVER (PARTITION BY V.[Type] ORDER BY V.[Date]) AS Grp
FROM (VALUES(CONVERT(date,'2022-01-01'),'Working',1),
(CONVERT(date,'2022-01-02'),'Working',1),
(CONVERT(date,'2022-01-03'),'Working',1),
(CONVERT(date,'2022-01-04'),'Resting',1),
(CONVERT(date,'2022-01-05'),'Resting',1),
(CONVERT(date,'2022-01-06'),'Resting',1),
(CONVERT(date,'2022-01-07'),'Working',2),
(CONVERT(date,'2022-01-08'),'Resting',2),
(CONVERT(date,'2022-01-09'),'Resting',2),
(CONVERT(date,'2022-01-10'),'Resting',2),
(CONVERT(date,'2022-01-11'),'Resting',2),
(CONVERT(date,'2022-01-12'),'Resting',2),
(CONVERT(date,'2022-01-12'),'Traveling',1),
(CONVERT(date,'2022-01-13'),'Working',3),
(CONVERT(date,'2022-01-14'),'Traveling',2),
(CONVERT(date,'2022-01-15'),'Working',4),
(CONVERT(date,'2022-01-16'),'Working',4))V([Date], [Type], Num))
SELECT G.Date,
G.Type,
G.Num AS YourNum,
DENSE_RANK() OVER (PARTITION BY G.Type ORDER BY Grp) AS CalcedNum
FROM Grps G
ORDER BY G.Date;