我有一個非常臟的表,其中混合了開始日期和一個值的更改生效日期。
桌子看起來像這樣
| ID | 價值 | 開始日期 | 結束日期 | 生效日期 |
|---|---|---|---|---|
| 1 | 0.3 | 2020-10-07 | 2021-02-28 | 2020-07-01 |
| 1 | 1 | 2020-10-07 | 2021-02-28 | 2020-10-07 |
| 2 | 0.46 | 2021-01-01 | 2021-01-01 | |
| 2 | 1 | 2021-01-01 | 2020-10-07 | 2021-05-01 |
| 3 | 1 | 2021-08-01 | 2021-08-01 | |
| 4 | 1 | 2019-03-01 | 2019-03-01 | |
| 4 | 0.5 | 2019-03-01 | 2020-08-01 | |
| 4 | 0.7 | 2019-03-01 | 2021-05-01 |
當結束日期為空時,這意味著沒有更改計劃,當開始日期晚于生效日期時,這意味著他們洗掉舊記錄并使用其他值創建新記錄。
我的目標是清理桌子并將它整理成這樣。
| ID | 價值 | 開始日期_有效 | enddate_valid |
|---|---|---|---|
| 1 | 0.3 | 2020-07-01 | 2020-10-07 |
| 1 | 1 | 2020-10-07 | 2021-02-28 |
| 2 | 0.46 | 2021-01-01 | 2021-05-01 |
| 2 | 1 | 2021-05-01 | |
| 3 | 1 | 2021-08-01 | |
| 4 | 1 | 2019-03-01 | 2020-08-01 |
| 4 | 0.5 | 2020-08-01 | 2021-05-01 |
| 4 | 0.7 | 2021-05-01 |
我怎么能做到這一點?
編輯:
我想我能夠startdate_valid通過使用獲得價值
MAX([effective date]) OVER(PARTITION BY id, YEAR([effective date]), MONTH([effective date]) ORDER BY [effective date])
這是有意義的,因為我已經在startdate列入effective date,但我仍然停留在為了得到enddate_valid
uj5u.com熱心網友回復:
我找到了解決我的問題的方法,我需要分兩步完成,所以如果有人有更好的解決方案,請分享,我會將其設定為正確的
SELECT
*,
COALESCE(
LEAD(sub.StartDate_value) OVER(PARTITION BY sub.Code ORDER BY sub.StartDate_value),
sub.[startdate]) AS [EndDate_value]
FROM (
SELECT
id, name,
COALESCE(
MAX([effective date]) OVER(PARTITION BY id YEAR([effective date]), MONTH([effective date]) ORDER BY [effective date]),
startdate)
) AS StartDate_value
from table ) sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/347765.html
標籤:sql sql-server
上一篇:如何將Laravel解決方案從MSSQLServer遷移到MySQL
下一篇:在一個陣列中存盤不同的函式指標?
