繁体   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