我正在努力使用一些 T-SQL 代碼來獲取列 [Num](在下面的示例表中)。基本上,我試圖在 [Type] 的新序列開始時創建一個索引。
問:如何創建下面的[num] 欄位?
[Num] 是欄位 [Type] 的順序范圍的順序。您會看到從 2022-01-01 到 2022-01-03 [Type] = 'Working'。然后在 2022 年 1 月 7 日,一個新的具有相同型別的連續行范圍開始(盡管只有一天),因此它是 2。基本上,如果沒有相同型別的連續天并且另一天彈出不同型別,范圍停止。當新的一天以相同的型別開始時(> 1 天后),一個新的范圍開始。你可以假設在我的情況下一天不可能有不同的型別。
讓我感到棘手的是,我無法在 Type 上對其進行磁區,因為它稍后會在使用常規 row_number 的新序列中重復出現。
為什么我需要這個的一些額外解釋:我通過采用按 [Type] 分組的最小值和最大值來創建一個具有有效起始日期和有效日期的 SCD 維度。但是由于 [Type] 是重復的,所以這不起作用。我需要一種方法來使 [Type] 的每個非連續序列都是唯一的。如果我的解決方案不是最佳的,我當然愿意接受其他建議。
表格1
| 日期 | 型別 | 編號 |
|---|---|---|
| 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-11 | 休息 | 2 |
| 2022-01-12 | 休息 | 2 |
| 2022-01-12 | 旅行 | 1 |
| 2022-01-13 | 在職的 | 3 |
| 2022-01-14 | 旅行 | 2 |
| 2022-01-15 | 在職的 | 4 |
| 2022-01-16 | 在職的 | 4 |
太感謝了!
更新:
我省略了我認為不必要的資訊。
這個問題的最終目標是創建一個如下表(table_2)。如果我在 table_1 中有欄位 [num],我將能夠自己創建 table_2,但我當然也愿意接受建議。
表_2
| 日期 | 型別 | 開始日期 | 結束日期 |
|---|---|---|---|
| 2022-01-01 | 在職的 | 2022-01-01 | 2022-01-03 |
| 2022-01-04 | 休息 | 2022-01-04 | 2022-01-06 |
| 2022-01-07 | 在職的 | 2022-01-07 | 2022-01-07 |
| 2022-01-08 | 休息 | 2022-01-08 | 2022-01-12 |
| 2022-01-12 | 旅行 | 2022-01-12 | 2022-01-12 |
| 2022-01-13 | 在職的 | 2022-01-13 | 2022-01-13 |
| 2022-01-14 | 旅行 | 2022-01-14 | 2022-01-14 |
| 2022-01-15 | 在職的 | 2022-01-15 | 2022-01-16 |
uj5u.com熱心網友回復:
這是一個典型的差距和孤島問題。找到你的島嶼,然后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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/514560.html
標籤:tsql差距和岛屿scd
上一篇:設定可從外部讀取的會話屬性
