簡體   English   中英

SQL - LAG 但根據值跳過特定行?

[英]SQL - LAG but skip specific rows based on value?

我有下表。 我想要做的是添加一個 LAG 列,它向我顯示之前的 [EndDate] 僅用於狀態不是 6 的條目。6 表示不活動..所以我不想計算它們。

SPID        ID            Status       StartDate                 EndDate   
29333       102             7         01 jan 2013              1 Jan 2014
29333       202             6         7 Jun 2021               15 Jun 2022
29333       384             6         10 jun 2021              17 jun 2022
29333       532             2         8 oct 2023               10 oct 2025

我使用了一個 LAG 函數,但不知道如何修改它以跳過我不需要的行? 我理想的輸出應該是這樣的..

SPID        ID            Status       StartDate                 EndDate           PrevED
29333       102             7         01 jan 2013              1 Jan 2014        01-Jan-1900  
29333       202             6         7 Jun 2021               15 Jun 2022       1-Jan-2014
29333       384             6         10 jun 2021              17 jun 2022       1-Jan-2014
29333       532             2         8 oct 2023               10 oct 2025       1-Jan-2014

關於實現這一目標的最佳方法的任何提示?

正如我在評論中提到的, LAG不太適合這個(除非你在 2022 年)。 相反,您可能希望在FROM中使用派生表:

SELECT YT.SPID,
       YT.ID,
       YT.Status,
       YT.StartDate,
       YT.EndDate,
       ISNULL(ED.EndDate,'19000101') AS PrevEdDate
FROM dbo.YourTable YT
     OUTER APPLY (SELECT TOP (1) oa.EndDate
                  FROM dbo.YourTable oa
                  WHERE oa.EndDate < YT.EndDate
                    AND oa.Status != 6
                  ORDER BY oa.EndDate DESC) ED;

如果您在 2022 年(預覽版),那么您可以使用LAG ,它是新的利用IGNORE NULLS功能以及CASE表達式:

SELECT SPID,
       ID,
       Status,
       StartDate,
       EndDate,
       LAG(CASE WHEN Status != 6 THEN EndDate END,1,'19000101') IGNORE NULLS OVER (ORDER BY EndDate) AS PrevEd
FROM dbo.YourTable;

你可以這樣做:

lag(EndDate) over (order by iif(Status=6,1,0), EndDate)

它將首先按狀態排序,將 6 放在列表底部,然后使用 EndDate 查找具有其他狀態的最新值。 當然,如果之前的狀態不超過6,它仍然會選擇它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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