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

How to exclude rows with date range overlaps

Postgresql - 数据格式如下

我目前正在使用以下 SQL 获取 属性

的所有预订日期

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

我能否将 if-else 逻辑应用于重叠 booking_dates(以红色和黄色突出显示)以仅选择最大 (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

您可以使用 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