-2

我想获取过去 30 天内连续 2 天离开的用户列表。

表名:参加UserId、Date、Leave Flag

休假标志是“Y”代表现在,“N”代表休假日。

这可以在 SQL 中完成吗?

谢谢

4

2 回答 2

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 天前离开的人

于 2012-06-07T18:11:08.297 回答
0

如果您每天只有一次休假,并且您正在使用具有窗口函数(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
于 2012-06-07T20:09:11.160 回答