如何排除日期范围重叠的行

时间:2015-08-10 00:24:28

标签: sql postgresql greatest-n-per-group

Postgresql - 数据采用以下格式

我目前正在使用以下SQL来获取为物业设置的所有预订日期

但是,在一天内,当用户多次更改某个属性的预订日期时,会创建多个条目,这会使汇总结果膨胀。

我可以将if-else逻辑应用于重叠的booking_dates(以红色和黄色突出显示),只选择max(updated_at)的预订日期(以黄色突出显示)?

例如,红色和黄色行的预订日期重叠。如果我应用以下SQL,那么我的总和将是不正确的。所以,我只需要考虑updated_at最多的预订日期

WITH X AS (SELECT distinct booking_end_date, booking_start_date, P_id
FROM booking)
SELECT sum(X.booking_end_date-X.booking_start_date) as Available, X.P_id
from X
group by X.P_id

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用distinct on获取每天的最后一个条目:

WITH X AS (
    SELECT DISTINCT ON (pid, date_trunc('day', updated_at)) b.*
    FROM booking b
    ORDER BY pid, date_trunc('day', updated_at), updated_at desc
   )
select sum(X.booking_end_date - X.booking_start_date) as Available,
       X.P_id
from X
group by X.P_id