4

我有一个表名 Att。其中有 2 列:EmpID 和日期。日期列包含员工在场的所有日期。我需要写一个查询来查找是否有员工连续缺勤超过 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)

这个想法是,我们选择一个日期的行,即使我们减去 10 天,对于相同的 EmpID,它仍然大于按时间顺序更早出现的所有行的日期。

day(date)应该是返回自纪元以来发生的天数的函数,而不是一个月中的一天或一周中的一天。或者,您可以执行类似date-10*ticksinday. 无论您做什么都将取决于您的 SQL 风格 :)

一旦这对您有意义,请实施它。

于 2013-02-10T08:52:08.070 回答
1

OUTER APPLY 和 EXISTS 的另一种选择

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