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)
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)
参见小提琴
当每个代码/天没有一行计算最大和最小(日期)之间的日期差异时,可以轻松修改此功能以使其工作