【问题标题】:How to exclude rows with date range overlaps如何排除日期范围重叠的行
【发布时间】:2015-08-10 00:24:28
【问题描述】:

Postgresql - 数据格式如下

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

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

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

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

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 这有助于消除在同一天创建的多个条目。但是,我的问题是红色显示的行无效,因为 1. 预订日期重叠和 2. 由于最新更新是在 2015 年 6 月 5 日以黄色显示的,因此只应考虑黄色的 booking_start_date 和 end_date 行.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2019-12-16
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多