Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找连续休假的用户_Sql_Oracle - Fatal编程技术网

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

我想获得在过去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' && 
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的建议。