Đây là nỗ lực của tôi để giải quyết vấn đề này:
select y,
sum( hrs_per_week )
from tmp_ranges t
join(
select daterange( x,
lead(x) over (order by x) ) As y
from (
select lower( rng ) As x
from tmp_ranges
union
select upper( rng )
from tmp_ranges
order by x
) y
) y
on t.rng && y.y
group by y
order by y
Demo: http://sqlfiddle.com/#!15/ef6cb/13
Truy vấn con trong cùng thu thập tất cả các ngày ranh giới thành một tập hợp bằng cách sử dụng union
, sau đó sắp xếp chúng.
Sau đó, truy vấn con bên ngoài xây dựng các phạm vi mới từ các ngày liền kề bằng cách sử dụng lead
hàm.
Cuối cùng, các phạm vi mới này được kết hợp với bảng nguồn trong truy vấn chính, được tổng hợp và sum
được tính toán.
CHỈNH SỬA
order by
mệnh đề trong truy vấn trong cùng là thừa và có thể bị bỏ qua vì lead(x) over
sử dụng các bản ghi đơn hàng theo ngày và tập kết quả từ truy vấn con trong cùng không cần phải được sắp xếp.