gpt4 book ai didi

sql - 具有多个记录(重叠)日期范围的工作日总和

转载 作者:行者123 更新时间:2023-12-04 19:27:09 28 4
gpt4 key购买 nike

假设有如下记录:

Employee_id, work_start_date, work_end_date

1, 01-jan-2014, 07-jan-2014
1, 03-jan-2014, 12-jan-2014
1, 23-jan-2014, 25-jan-2014
2, 15-jan-2014, 25-jan-2014
2, 07-jan-2014, 15-jan-2014
2, 09-jan-2014, 12-jan-2014

要求是编写一个 SQL select 语句,该语句将按 employee_id 分组的工作日进行汇总,但排除重叠的时间段(意思是 - 只将它们计算一次)。

期望的输出是:

Employee_id, worked_days

1, 13
2, 18

日期范围内工作日的计算是这样进行的:如果工作开始日期 = 5 且工作结束日期 = 9,则工作天数 = 4 (9 - 5)。

我可以编写一个 pl/sql 函数来解决这个问题(手动遍历记录并进行计算),但我确信它可以使用 SQL 来完成以获得更好的性能。

有人能给我指出正确的方向吗?

谢谢!

最佳答案

这是来自类似问题的略微修改的查询:
compute sum of values associated with overlapping date ranges

SELECT "Employee_id",
SUM( "work_end_date" - "work_start_date" )
FROM(
SELECT "Employee_id",
"work_start_date" ,
lead( "work_start_date" )
over (Partition by "Employee_id"
Order by "Employee_id", "work_start_date" )
As "work_end_date"
FROM (
SELECT "Employee_id", "work_start_date"
FROM Table1
UNION
SELECT "Employee_id","work_end_date"
FROM Table1
) x
) x
WHERE EXISTS (
SELECT 1 FROM Table1 t
WHERE t."work_start_date" > x."work_end_date"
AND t."work_end_date" > x."work_start_date"
OR t."work_start_date" = x."work_start_date"
AND t."work_end_date" = x."work_end_date"
)
GROUP BY "Employee_id"
;

演示:http://sqlfiddle.com/#!4/4fcce/2

关于sql - 具有多个记录(重叠)日期范围的工作日总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790678/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com