[英]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.