Sql 查找连续休假的用户
我想获得在过去30天内连续两天休假的用户列表 表名:出席 用户标识、日期、离开标志 休假标志为“Y”表示当前,为“N”表示休假日 这可以在SQL中完成吗 多谢各位Sql 查找连续休假的用户,sql,oracle,Sql,Oracle,我想获得在过去30天内连续两天休假的用户列表 表名:出席 用户标识、日期、离开标志 休假标志为“Y”表示当前,为“N”表示休假日 这可以在SQL中完成吗 多谢各位 SELECT DISTINCT a.UserId FROM Attend AS a INNER JOIN Attend AS b ON a.UserId == b.UserId && a.LeaveFlag == 'N' && b.LeaveFlag == 'N' && DATEDIF
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天前离开的人员如果您每天只有一次休假,并且您使用的数据库具有Oracle支持的窗口功能,那么您可以使用一种技巧来避免自加入。它确实需要其他处理 其思想是,如果我们为用户生成一个按日期排序的数字序列,那么这个序列和日期之间的差值将是恒定的。例如,如果日期是3月2日、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
你会发现,如果你能证明自己有能力,你会得到更高质量的答案,人们也会更愿意帮助你。在你的问题中,这似乎是一个反复出现的主题。对于这样的查询,至少有两种基本方法。您可以执行自联接或相关子查询,以同时查看今天和昨天的数据。很容易假设昨天可以使用Oracle日期数学找到,例如,没有任何复杂的业务逻辑规则定义昨天。当然,请听从@Ben的建议。