如何找到超过10天缺席的员工?

时间:2013-02-10 08:44:21

标签: sql sql-server tsql sql-server-2005

我有一个表名Att。它有2列:EmpID和Date。 日期列包含员工在场的所有日期。 我需要写一个查询来查找是否有任何员工持续缺席超过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。 怎么做到这一点?请帮忙。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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风格:)

一旦这对你有意义,就实施它。

答案 2 :(得分: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上的演示