[英]Add LAG or ROW_NUMBER into an Unusually Sorted Table
我之前曾問過一個關於如何以不尋常的方式按表排序的問題( SQL 服務器:兩級排序(排序/分組依據??) )。 我已將解決方案添加到我的代碼中:
SELECT [Date]
,[ID]
,[Account]
,[First_Last]
FROM [Table]
ORDER BY [ID], MIN([Date]) OVER (PARTITION BY [Account], [ID]), [Account], [Date]
Date ID Account First_Last
9/29/2017 1111 753 1
9/28/2018 1111 753 2
10/31/2018 1111 45 1
1/29/2021 1111 45 4
2/28/2017 2222 621 1
2/28/2018 2222 621 2
6/30/2017 2222 1007 1
6/29/2018 2222 1007 2
9/29/2017 2222 481 1
1/31/2018 2222 481 2
10/31/2017 2222 488 1
1/31/2018 2222 488 2
11/30/2017 2222 582 1
1/31/2019 2222 582 3
現在,我想添加更改標志以在Account
更改時發出信號,但是每當我嘗試LAG
或ROW_NUMBER
時, ORDER BY
語句都會給我帶來麻煩。 如果我使用:
[Account] <> LAG([Account]) OVER (ORDER BY [ID], MIN([Date]) OVER (PARTITION BY [Account], [ID]), [Account], [Date])
它向我顯示了這個錯誤:
窗口函數不能在另一個窗口 function 或聚合的上下文中使用。
但是,如果我在沒有 window function 的情況下不使用不同的ORDER BY
,則將Account
與不正確的數字進行比較,而不是之前的數字,例如:
SELECT [Date]
,[ID]
,[Account]
,[First_Last]
,CASE WHEN[Account] <> LAG([Account]) OVER (ORDER BY [Account]) THEN '1' END AS [Acct_Chg]
FROM [Table]
ORDER BY [ID], MIN([Date]) OVER (PARTITION BY [Account], [ID]), [Account], [Date]
結果是這樣的:
Date ID Account First_Last Acct_Chg
9/29/2017 1111 753 1
9/28/2018 1111 753 2
10/31/2018 1111 45 1
1/29/2021 1111 45 4 1
2/28/2017 2222 621 1 1
2/28/2018 2222 621 2
6/30/2017 2222 1007 1
6/29/2018 2222 1007 2 1
9/29/2017 2222 481 1
1/31/2018 2222 481 2
10/31/2017 2222 488 1
1/31/2018 2222 488 2 1
11/30/2017 2222 582 1 1
1/31/2019 2222 582 3
這是不正確的。
最終,我正在尋找的是:
Date ID Account First_Last Acct_Chg
9/29/2017 1111 753 1
9/28/2018 1111 753 2
10/31/2018 1111 45 1 1
1/29/2021 1111 45 4
2/28/2017 2222 621 1 1
2/28/2018 2222 621 2
6/30/2017 2222 1007 1 1
6/29/2018 2222 1007 2
9/29/2017 2222 481 1 1
1/31/2018 2222 481 2
10/31/2017 2222 488 1 1
1/31/2018 2222 488 2
11/30/2017 2222 582 1 1
1/31/2019 2222 582 3
我不知道我可以用LAG
做到這一點,或者我是否需要ROW_NUMBER
,但我無法按照我想要的方式工作。
任何幫助將不勝感激。
謝謝你。
更新:
我試過了:
SELECT [Date]
,[ID]
,[Account]
,[First_Last]
,CASE WHEN [Account] <> LAG([Account]) OVER (ORDER BY [Account], [Date] DESC) THEN '1' END AS [Acct_Chg]
FROM [Table]
ORDER BY [ID], MIN([Date]) OVER (PARTITION BY [Account], [ID]), [Account], [Date]
得到了這個:
Date ID Account First_Last Acct_Chg
9/29/2017 1111 753 1
9/28/2018 1111 753 2
10/31/2018 1111 45 1
1/29/2021 1111 45 4 1
2/28/2017 2222 621 1
2/28/2018 2222 621 2
6/30/2017 2222 1007 1
6/29/2018 2222 1007 2
9/29/2017 2222 481 1
1/31/2018 2222 481 2
10/31/2017 2222 488 1
1/31/2018 2222 488 2 1
11/30/2017 2222 582 1
1/31/2019 2222 582 3 1
正如您發現的那樣,您不能在另一個 window ZC1C425268E68385D1AB5074F14Z 中使用 window function。
解決方法是使用CTE
並在 CTE 中找到MINDATE
MIN([Date]) OVER (PARTITION BY [Account], [ID])
。 然后在外部查詢中,您可以正常使用LAG()
。
WITH CTE AS
(
SELECT [Date]
,[ID]
,[Account]
,[First_Last]
,MIN([Date]) OVER (PARTITION BY [Account], [ID]) AS [MINDATE]
FROM [Table]
)
SELECT [Date]
,[ID]
,[Account]
,[First_Last]
,CASE WHEN [Account] <> LAG([Account]) OVER (ORDER BY [ID], [MINDATE], [Account], [Date])
THEN '1'
END AS [Acct_Chg]
FROM CTE
ORDER BY [ID], [MINDATE], [Account], [Date]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.