我正在 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)
;
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;