過去30日間に2日連続で休暇を取っているユーザーのリストを取得したい。
テーブル名:UserId、Date、LeaveFlagに参加
休暇フラグは、現在の場合は「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
31 日前と 30 日前に不在だった人を含めるか除外するかによって、where 句を変更する必要がある場合があります。
休暇が 1 日に 1 回だけで、(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