sql:如何查找聚合中满足条件的连续日期

问题描述 投票:0回答:1

我正在 Azure SQL MI 中工作。我正在努力处理某个 SQL 查询。我有一个如下所示的“时间表”表:

EmployeeID    DateWorked    LaborType    Hours
----------------------------------------------
1             2024-01-01    work         13
1             2024-01-02    work         12
1             2024-01-03    no work      24
1             2024-01-04    work         8
2             2024-01-01    no work      24
2             2024-01-02    work         11
2             2024-01-03    work         8
2             2024-01-04    work         13

每个员工的每个日期都只有 1 行。 “不工作”时间永远是 24 小时。

我们有规定,员工连续 2 天工作时间不得超过 24 小时。我需要找到所有违反规则的实例。例如,员工 1 违反了日期 2024-01-01 和 2024-01-02 的规则,因为他工作了 25 (13 + 12) 小时。他没有违反日期 2024-01-02 和 2024-01-03 的规则,因为 2024-01-03 行是“no work”。同样,员工 2 也没有违规行为。

所以,我期望输出如下:

EmployeeID     ViolationDates            TotalHoursWorked
-------------------------------------------------------
1              2024-01-01, 2024-01-02        25

如何编写查询来返回此输出?

如果有帮助,下面是示例数据的一些 T-SQL。

CREATE TABLE dbo.timesheet_mockup
    (
        EmployeeID int
        ,DateWorked date
        ,LaborType varchar(7)
        ,Hours int
    )
    ;

INSERT INTO
    dbo.timesheet_mockup
VALUES
    (1, '2024-01-01', 'work', 13)
    ,(1, '2024-01-02', 'work', 12)
    ,(1, '2024-01-03', 'no work', 24)
    ,(1, '2024-01-04', 'work', 8)
    ,(2, '2024-01-01', 'no work', 24)
    ,(2, '2024-01-02', 'work', 11)
    ,(2, '2024-01-03', 'work', 8)
    ,(2, '2024-01-04', 'work', 13)
;
sql sql-server gaps-and-islands azure-sql-managed-instance
1个回答
0
投票
select *
from T t1 inner join T t2
    on t2.EmployeeID = t1.EmployeeID
        and t2.DateWorked = dateadd(day, -1, t1.DateWorked)
        and t1.LaborType = 'work' and t2.LaborType = 'work'
where t1.Hours + t2.Hours > 24;
© www.soinside.com 2019 - 2024. All rights reserved.