如何连续3天查找具有相同状态的sql表的数据

Abd*_*mun 5 sql database sql-server

我有一个像下面这样的SQL表

Code Name    DayStatus  Date
101  John    A          20-May-2018
101  John    A          19-May-2018
101  John    A          18-May-2018
102  Karl    A          20-May-2018
102  Karl    A          19-May-2018
102  Karl    P          18-May-2018
103  Lorem   P          20-May-2018
103  Lorem   A          19-May-2018
103  Lorem   A          18-May-2018
104  Ipsum   A          20-May-2018
104  Ipsum   P          19-May-2018
104  Ipsum   A          18-May-2018
105  Milton  A          20-May-2018
105  Milton  A          19-May-2018
105  Milton  A          18-May-2018
107  Saleh   A          20-May-2018
107  Saleh   A          19-May-2018
107  Saleh   W          18-May-2018
107  Saleh   A          17-May-2018
108  Virat   A          20-May-2018
108  Virat   H          19-May-2018
108  Virat   A          18-May-2018
108  Virat   A          17-May-2018
Run Code Online (Sandbox Code Playgroud)

这里"A"代表Absent,"P"代表现在,"H"代表Holiday,"W"代表弱者.

从表中,我需要找出连续3天缺席的员工,并且只能计算员工当天的状态是否为A(缺席).

对于virat和saleh,它也将被视为连续缺席.但是如果P(现在)将出现在连续的一天之间,那么它不算作连续缺席.

预期的产量应该是---

Code Name    
101  John          
105  Milton          
107  Saleh             
108  Virat       
Run Code Online (Sandbox Code Playgroud)

dno*_*eth 1

with cte as
 (
   select *
      -- cumulative Max, returns 0 as long as there's no P status
     ,max(CASE WHEN DayStatus = 'P' THEN 1 ELSE 0 END)
      over (partition by code
            order by date desc) as mx
      -- status of the latest date
     ,first_value(DayStatus)
      over (partition by code
            order by date desc) as fv
   from Table1
 )
select code, name, count(*) as absentDays
from cte
where fv = 'A'   -- current status = 'A'
  and mx = 0     -- all rows before the 1st 'P'
group by code, name
having
   -- at least three days absent
   count(*) >= 3;
Run Code Online (Sandbox Code Playgroud)

参见小提琴

当每个代码/天没有一行计算最大和最小(日期)之间的日期差异时,可以轻松修改此功能以使其工作