如何使非连续范围唯一



我正在使用一些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

类型1112<1>44
日期Num
2022-01-01 工作 1
2022-01-02 工作
2022-01-03 工作
2022-01-04 休息 1
2022-01-05 休息
2022-01-06 休息 1
2022-01-07 工作
2022-01-08 休息 2
2022-01-09 休息 2
2022-01-10 休息 2
2022-01-1 休息 2
2022-012 休息 2
2022-012 旅行
2022-013 工作 3
2022-01-14 旅行 2
2022-015 工作
2022-01-16 工作

这是一个典型的缺口和孤岛问题。找到你的岛屿,然后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;

相关内容

  • 没有找到相关文章

最新更新