我需要检查行值是否在下一行重复。如果不是,那么票证仍处于打开状态,并且票证处于关闭状态,那么我需要在“已关闭”列中显示值。
在下面的示例中,票证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
答案 0 :(得分:1)
这是您想要的吗?
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;
答案 1 :(得分:1)
假设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>
。
答案 2 :(得分:0)
如果使用SQL Server 2012或更高版本,则可以使用LEAD()
。这是一个示例:
我通过LEAD()
函数找到了下一个票证编号,该函数由TicketNumber划分。如果返回的值表示票证仍未关闭。如果为空,票证将关闭。
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