【问题标题】:How to count the maximum amount of reservations that are overlapping in one day?如何计算一天内重叠的最大预订量?
【发布时间】:2021-11-28 14:20:11
【问题描述】:

我有一个预订表,其中我有每个预订的开始和结束日期。

id | start | end
----------------
 1     2      5
 2     4      8
 3     3      4
 4    10     15
 5     9     16

我正在尝试计算一天内重叠的最大预订量。到目前为止,我有一个预订清单以及与它重叠的其他预订:

SELECT r1.id, r2.id
FROM Reservations r1
JOIN Reservations r2
WHERE r2.start <= r1.end AND r2.end >= r1.start AND r1.id != r2.id

返回

r1.id | r2.id
  1       2
  1       3
  2       1
  2       3
  3       1
  3       2
  4       5
  5       4

现在我现在哪些预订重叠,但我不知道如何计算每天的预订数量,有多少预订。有什么提示我应该从这里继续吗?

【问题讨论】:

  • 您能否提供示例的输出应该是什么样的?
  • 这个例子的输出应该是 3

标签: sql count


【解决方案1】:

我试图用第二张表来解决这个问题,其中包含一天中的时间。将各个 ID 加入每个涉及的时间,并对给定时间的 ID 进行汇总。然后我选择了这些中的最大值:

DROP TABLE IF EXISTS data;

CREATE TABLE data (
    id INTEGER
    ,start INTEGER
    ,finish INTEGER
)
;

INSERT INTO data VALUES
        (1, 2, 5)
        ,(2, 4, 8)
        ,(3, 3, 4)
        ,(4, 10, 15)
        ,(5, 9, 16)
;

ANALYZE data;

DROP TABLE IF EXISTS times;

CREATE TABLE times (
        time INTEGER
)
;

INSERT INTO times VALUES
        (0)
        ,(1)
        ,(2)
        ,(3)
        ,(4)
        ,(5)
        ,(6)
        ,(7)
        ,(8)
        ,(9)
        ,(10)
        ,(11)
        ,(12)
        ,(13)
        ,(14)
        ,(15)
        ,(16)
        ,(17)
        ,(18)
        ,(19)
        ,(20)
        ,(21)
        ,(22)
        ,(23)
;

ANALYZE times;

SELECT
    MAX(d.anz_ds) max_anz_ds
FROM
    (
    SELECT
        c.time
        ,COUNT(*) anz_ds
    FROM
        (
        SELECT
            a.time
            ,b.id
        FROM
            times a
            JOIN data b ON (a.time BETWEEN b.start AND b.finish)
        ORDER BY a.time, b.id
        ) c
    GROUP BY 1
    ORDER BY 1
    ) d
;

这里有一些东西可以摆弄它: db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多