我希望获得在过去30天内连续2天离开的用户列表。
表名:出席 UserId,Date,Leave Flag
离开标志为'Y'表示现在,'N'表示休假日。
可以在SQL中完成吗?
谢谢
答案 0 :(得分:0)
SELECT DISTINCT a.UserId FROM Attend AS a
INNER JOIN Attend AS b
ON a.UserId == b.UserId && a.LeaveFlag == 'N' && b.LeaveFlag == 'N' &&
DATEDIFF(dd,a.Date,b.Date) > 0 && a.Date < b.Date
WHERE DATEDIFF(dd, a.Date, GETDATE()) <= 30
可能必须修改where子句,具体取决于您是否要包含或排除31天前和30天前离开的人
答案 1 :(得分:0)
如果您每天只有一次休假并且您正在使用具有窗口功能的数据库(Oracle支持),那么您可以使用一种技巧来避免自联接。它确实需要其他处理。
这个想法是,如果我们生成一个数字序列,按用户的日期排序,那么这个序列和日期之间的差异将是不变的。例如,如果日期是3月4日,4日,5日,7日,那么序列将是1,2,3,4,差异将是3月1日,3月2日,3月2日,3月3日。我们可以看看在此列表中重复。
以下查询使用此方法:
select userid
from (select t.*,
dateadd(d, -seqnum, t.date) as diff
from (select t.*, row_number() over (partition by userid order by date) as seqnum
from t
where datediff(d, t.date, getdate()) <= 30 and leave = 'Y'
) t
) t
group by userid, diff
having count(*) > 1