我有下表,除了其他屬性之外還包含:
- ID - 唯一識別符號
- 第 1 列
- 第 2 列
- 第 3 列
- CreatedDate - 創建記錄的時間(基于 ETL)
- UpdatedDate - 直到記錄有效
由于除了 3 列之外還有其他屬性正在跟蹤歷史值,因此可能存在這樣的情況,即相同 ID 的所有三列的多行具有相同的值,但 [CreatedDate] / 中的時間戳不同[更新日期]。因此,資料可能如下所示:
| ID | 第 1 列 | 第 2 列 | 第 3 列 | 創建日期 | 更新日期 |
|---|---|---|---|---|---|
| 1122 | T1 | 進行中 | 空值 | 2022 年 2 月 2 日 18:39:38 | 29/03/2022 14:25:24 |
| 1122 | T1 | 進行中 | 空值 | 2022 年 5 月 1 日 10:45:50 | 2022 年 2 月 2 日 18:39:38 |
| 1122 | T1 | 進行中 | 空值 | 2022 年 3 月 1 日 12:11:47 | 2022 年 5 月 1 日 10:45:50 |
| 1122 | T1 | 進行中 | 是的 | 13/12/2021 21:43:44 | 2022 年 3 月 1 日 12:11:47 |
| 1122 | T1 | 進行中 | 空值 | 17/02/2021 14:12:15 | 13/12/2021 21:43:44 |
| 1122 | T1 | 進行中 | 空值 | 22/12/2020 14:38:32 | 17/02/2021 14:12:15 |
| 1122 | T1 | 進行中 | 空值 | 17/12/2020 18:38:38 | 22/12/2020 14:38:32 |
| 1122 | T3 | 準備好 | 空值 | 2020 年 3 月 30 日 14:35:18 | 17/12/2020 18:38:38 |
| 1122 | 空值 | 準備好 | 空值 | 2019 年 4 月 9 日 18:33:24 | 2020 年 3 月 30 日 14:35:18 |
| 1122 | T2 | 準備好 | 空值 | 2019 年 7 月 1 日 11:07:39 | 2019 年 4 月 9 日 18:33:24 |
| 1122 | T2 | 準備好 | 空值 | 17/09/2018 14:31:17 | 2019 年 7 月 1 日 11:07:39 |
| 1122 | T0 | 準備好 | 空值 | 28/08/2018 14:31:39 | 17/09/2018 14:31:17 |
| 1122 | T0 | 準備好 | 空值 | 13/02/2018 14:48:44 | 28/08/2018 14:31:39 |
我想以正確的順序保持所有 3 列的唯一值,因此理想的輸出應如下所示:
| ID | 第 1 列 | 第 2 列 | 第 3 列 | 創建日期 | 更新日期 |
|---|---|---|---|---|---|
| 1122 | T1 | 進行中 | 空值 | 2022 年 3 月 1 日 12:11:47 | 29/03/2022 14:25:24 |
| 1122 | T1 | 進行中 | 是的 | 13/12/2021 21:43:44 | 2022 年 3 月 1 日 12:11:47 |
| 1122 | T1 | 進行中 | 空值 | 17/12/2020 18:38:38 | 13/12/2021 21:43:44 |
| 1122 | T3 | 準備好 | 空值 | 2020 年 3 月 30 日 14:35:18 | 17/12/2020 18:38:38 |
| 1122 | 空值 | 準備好 | 空值 | 2019 年 4 月 9 日 18:33:24 | 2020 年 3 月 30 日 14:35:18 |
| 1122 | T2 | 準備好 | 空值 | 17/09/2018 14:31:17 | 2019 年 4 月 9 日 18:33:24 |
| 1122 | T0 | 準備好 | 空值 | 13/02/2018 14:48:44 | 17/09/2018 14:31:17 |
如果只有一列,下面的代碼可以正常作業,但它不適用于多列,因為它回傳所有唯一行。
select ID, Column1, Column2, Column3, min(createddate), max(updateddate)
from (select t.*,
sum(case when prev_updatedate >= createddate then 0 else 1 end) over (partition by ID order by createddate) as grp
from (select h.*,
max(updateddate) over (partition by ID order by createddate rows between unbounded preceding and 1 preceding) as prev_updatedate
from #history h
) h
) h
group by ID, Column1, Column2, Column3, grp;
任何想法如何解決它,請?
uj5u.com熱心網友回復:
您可以嘗試使用ROW_NUMBER視窗函式來與您的邏輯建立差距,然后您可能會獲得差距和島嶼的分組
SELECT ID,Column1,Column2,Column3, min(createddate) CreatedDate, max(updateddate) UpdatedDate
FROM (
select *,
ROW_NUMBER() over (partition by ID order by createddate) -
ROW_NUMBER() over (partition by ID,Column1,Column2,Column3 order by createddate) grp
from history
) t1
GROUP BY grp,ID,Column1,Column2,Column3
ORDER BY CreatedDate DESC
sqlfiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/451909.html
