簡體   English   中英

SQL Server檢查下一行是否重復值

[英]SQL Server Check if Value repeats in next row

我需要檢查行值是否在下一行重復。 如果沒有,那么票證仍處於打開狀態,並且票證處於關閉狀態,那么我需要在“已關閉”列中顯示值。

在下面的示例中,票證55從5月1日到5月7日開放,因此我每天在開放列中顯示它為開票,並在5月7日將票證關閉,因此我將其顯示為已關閉

         Ticket    Open  Closed 
5/1/2019    55      1   
5/2/2019    55      1   
5/3/2019    55      1   
5/4/2019    55      1   
5/5/2019    55      1   
5/6/2019    55      1   
5/7/2019    55      1   1
5/8/2019    60

這是你想要的嗎?

select t.*,
       (case when date = max(date) over (partition by ticket)
             then 1 else 0
        end) as closed
from t;

看來您只是希望1 as open

如果票證值可以重復,請使用lead()

select t.*,
       (case when ticket = lead(ticket) over (partition by ticket order by ticket)
             then 0 else 1
        end) as closed
from t;

假設您未顯示名稱的ticket和日期列不可為空,則可以使用lead()獲取該票證的下一個票證ID,該票證由您未顯示名稱的日期列對記錄進行排序。 如果為空,則表示沒有后續行動。 同樣使用lead()您可以檢查下一條記錄的日期是否是第二天。

SELECT ...
       CASE
         WHEN lead(ticket) OVER (PARTITION BY ticket
                                 ORDER BY <your anonymous date column>) IS NULL
               OR lead(<your anonymous date column>) OVER (PARTITION BY ticket
                                                           ORDER BY <your anonymous date column>) <> dateadd(day, 1, <your anonymous date column>) THEN
           1
       END closed,
       ...

<your anonymous date column>替換為<your anonymous date column>的名稱。

如果使用SQL Server 2012或更高版本,則可以使用LEAD() 這是一個示例:

我已經通過按票證編號划分的LEAD()函數找到了下一個票證編號。 如果返回的值表示票證仍未關閉。 如果為空,票證將關閉。

SELECT    T.TicketDate
        , T.TicketNumber
        , CASE WHEN LEAD(T.TicketNumber) OVER (PARTITION BY T.TicketNumber ORDER BY T.TicketDate ) IS NULL THEN '' ELSE '1' END [Open]
        , CASE WHEN LEAD(T.TicketNumber) OVER (PARTITION BY T.TicketNumber ORDER BY T.TicketDate ) IS NULL THEN '1'ELSE '' END Closed
FROM Ticket T

暫無
暫無

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

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