假设有以下记录:
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
日期范围内工作日的计算如下:如果work_start_date = 5且work_end_date = 9,则work_days = 4(9-5)。
我可以编写一个pl / sql函数来解决此问题(手动遍历记录并进行计算),但是我确信可以使用SQL来实现,以实现更好的性能。
有人能指出我正确的方向吗?
谢谢!
这是对类似问题的稍作修改的查询:
计算与重叠的日期范围相关联的值的总和
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"
;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句