簡體   English   中英

將 LAG 或 ROW_NUMBER 添加到異常排序的表中

[英]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更改時發出信號,但是每當我嘗試LAGROW_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM