查找具有连续叶子的用户

时间:2012-06-07 17:42:21

标签: sql oracle

我希望获得在过去30天内连续2天离开的用户列表。

表名:出席 UserId,Date,Leave Flag

离开标志为'Y'表示现在,'N'表示休假日。

可以在SQL中完成吗?

谢谢

2 个答案:

答案 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