4

私はテーブル名Attを持っています。EmpID と Date の 2 つの列があります。日付列には、従業員が存在するすべての日付が含まれています。従業員が10 日以上連続して欠勤しているかどうかを調べるクエリを作成する必要があります。

EmpID | Date
  101 | 1/1/2012
  101 | 2/1/2012
  101 | 7/1/2012
  101 | 18/1/2012
  101 | 21/1/2012
  101 | 25/1/2012
  101 | 30/1/2012
  102 | 1/1/2012
  102 | 2/1/2012
  102 | 5/1/2012
  102 | 9/1/2012
  102 | 14/1/2012
  102 | 19/1/2012
  102 | 24/1/2012
  102 | 25/1/2012
  102 | 28/1/2012
  102 | 29/1/2012
  102 | 30/1/2012

結果はここで 101 になるはずです。これはどのように行うことができますか?助けてください。

4

3 に答える 3

3

を使用している場合は、分析関数SQL Server 2012を使用できますLEAD

WITH recordList
AS
(
  SELECT EmpID, Date FromDate,
         LEAD(Date) OVER (PARTITION BY EmpID ORDER BY Date ASC) ToDate
  FROM   tableName
)
SELECT DISTINCT EmpID
FROM recordList 
WHERE DATEDIFF(d, FromDate ,ToDate) >= 10

その他のリンク

更新 1

WITH firstList
AS
(
  SELECT EmpID, Date,
         ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY Date ASC) RN
  FROM   tableName
)
SELECT  DISTINCT a.EmpID
FROM    firstList a
        INNER JOIN firstList b
          ON a.RN + 1 = b.RN
WHERE   DATEDIFF (d, a.Date , b.Date ) >= 10
于 2013-02-10T08:54:18.650 に答える
1

サブクエリを使用する必要があります。何かのようなもの

select * from Att a1
where day(a1.date)-10 > all
(select day(a2.date) from Att a2 where a2.empid = a1.empid and a2.date < a1.date)

これは、同じ EmpID について、10 日を差し引いても、時系列的に前に発生したすべての行の日付よりも大きい日付の行を選択するというものです。

day(date)月の日や曜日ではなく、エポックからの経過日数を返す関数である必要があります。または、次のようなこともできますdate-10*ticksinday。あなたが何をするにしても、あなたのSQLフレーバーに依存します:)

これが理解できたら、実装してください。

于 2013-02-10T08:52:08.070 に答える
1

OUTER APPLY と EXISTS を使用したもう 1 つのオプション

SELECT t1.[EmpID], t1.[Date], o.[EmpID], o.[Date],
       DATEDIFF(d, o.[Date], t1.[Date]) AS diff        
FROM TableName t1 
OUTER APPLY (
             SELECT t2.[EmpID], t2.[Date]
             FROM TableName t2
             WHERE EXISTS (
                           SELECT 1
                           FROM TableName t3
                           WHERE  t1.[Date] > t3.[Date] 
                             AND t1.EmpID = t2.EmpID
                           HAVING MAX(t3.[Date]) = t2.[Date]
                           ) 
             ) o
WHERE DATEDIFF(d, o.[Date], t1.[Date]) >= 10 

SQLFiddle のデモ

于 2013-02-10T09:26:17.377 に答える