如何找到连续缺席n天的人?

5 sql sql-server sql-server-2005

数据库:MS SQL 2005

表:

EmployeeNumber | EntryDate | 状态

样本数据:

200 | 3/1/2009 | P
200 | 2009年3月2日| A
200 | 2009年3月3日| A
201 | 3/1/2009 | A
201 | 2009年3月2日| P

在存在P的情况下,A不存在.我已尝试过row_number.但它不会产生我期望的序列.

对于上述数据,我期望的序列是1 1 2 1 1

SELECT EmployeeNumber, EntryDate,Status
    ROW_NUMBER() OVER (
    PARTITION BY EmployeeNumber, Status
    ORDER BY EmployeeNumber,EntryDate    ) AS 'RowNumber'
    FROM [Attendance]
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 1

您应该能够使用 SQL 2005 中的 CTE 来完成此操作。窃取 Lievens 数据:

DECLARE @Attendance TABLE (EmployeeNumber INTEGER, EntryDate DATETIME, Status VARCHAR(1))

INSERT INTO @Attendance VALUES (200, '03/01/2009', 'P')
插入@Attendance VALUES (200, '03/02/2009', 'A')
插入@Attendance VALUES (200, '03/03/2009', 'A')
插入@Attendance VALUES (200, '03/04/2009', 'A')
插入@Attendance VALUES (200, '04/04/2009', 'A')
插入@Attendance VALUES (200, '04/05/2009', 'A')
插入@Attendance VALUES (201, '03/01/2009', 'A')
插入@Attendance VALUES (201, '03/02/2009', 'A')
INSERT INTO @Attendance VALUES (201, '03/03/2009', 'P');

然后使用这个 CTE 来提取序列:

 带日期
    (
        入境日期,
        员工编号,
        地位,
        天
    )
    作为
    (
        选择
            a.输入日期,
            a.员工编号,
            a. 状态,
            1
        从
            @出席a

        在哪里
            a.EntryDate = (从@Attendance中选择MIN(EntryDate))


        -- 递归    
        联合所有

        选择
            a.输入日期,
            a.员工编号,
            a. 状态,
            CASE WHEN (a.Status = Parent.Status) THEN Parent.Days + 1 ELSE 1 END
        从
            @出席a
        内部联接
            日期父母
        在
            datediff(日,a.EntryDate,DateAdd(日,1,parent.EntryDate))= 0
        和
            a.员工编号 = 父级.员工编号
    )

    SELECT * FROM 日期顺序(按员工编号、条目日期)

尽管作为最后一点,该序列对我来说似乎很奇怪,但根据您的要求,可能有更好的方法来聚合数据?尽管如此,这将产生您需要的序列