【问题标题】:how to find employee who is absent continuously more than 10 days?如何找到连续缺勤10天以上的员工?
【发布时间】:2013-02-10 08:44:20
【问题描述】:

我有一个表名 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。 如何做到这一点?请帮忙。

【问题讨论】:

  • 你应该解雇他。
  • @ weaselfox ...也许我应该,这就是为什么我需要这个查询来从成千上万的员工中找到他。 @JW。为什么要减去兄弟?我只是在编辑,看到它已经被编辑了。 :(
  • 不,我还没有投票。
  • 你使用的是什么版本的sql server?
  • sql server 2005,很抱歉错过了

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


【解决方案1】:

如果您正在使用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

【讨论】:

  • 正是需要这个东西,但在 sql server 2005 中。
  • @JW secondList 是多余的,最终查询只能有firstlist a INNER JOIN firstList b ON a.RN+1=b.RN
  • @DaleM 是的,我没想到。 grr(由于想太多哈哈哈)。我会更新的。
【解决方案2】:

您想使用子查询。类似的东西

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 风格:)

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

【讨论】:

    【解决方案3】:

    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上的演示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2021-06-03
      • 2019-02-24
      • 2010-12-06
      相关资源
      最近更新 更多