-2

過去30日間に2日連続で休暇を取っているユーザーのリストを取得したい。

テーブル名:UserId、Date、LeaveFlagに参加

休暇フラグは、現在の場合は「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

31 日前と 30 日前に不在だった人を含めるか除外するかによって、where 句を変更する必要がある場合があります。

于 2012-06-07T18:11:08.297 に答える
0

休暇が 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
于 2012-06-07T20:09:11.160 に答える