Перебрать набор дат в PostgreSQL - PullRequest
0 голосов
/ 26 мая 2020

В настоящее время я использую базу данных, используя PostgreSQL. У меня есть следующая база данных (надеюсь, что ER-диаграмма полностью ее описывает) enter image description here

Что вам нужно знать об этой базе данных, так это то, что друг может отдохнуть и провести отпуск который представлен в таблице holiday с помощью id, start_date и end_date друга.

Я хочу создать запрос PostgreSQL, который найдет даты, когда ровно N друзей праздник. Меня смущает перебор периода между датой начала и датой окончания (подойдет любое решение, которое поможет с этим запросом).

Пример: предположим, что таблица holiday имеет такое содержимое

(1, '2012-05-23', '2012-05-27', 1)
(2, '2012-05-23', '2012-05-24', 2)
(3, '2012-05-24', '2012-05-26', 3)

Предположим, что таблица friend содержит этих трех друзей.

Вывод для number of friends = 3 будет '2012-05-24'.

Для number of friends = 2 будет ('2012-05-23', '2012-05-25' , '2012-05-26').

1 Ответ

1 голос
/ 26 мая 2020

Вы можете использовать GENERATE_SERIES, чтобы создать список всех дат от самого раннего start_date до последнего end_date, а затем LEFT JOIN до holiday, чтобы найти всех друзей которые были в отпуске в определенный день. Затем вы можете их подсчитать и отфильтровать по результату. Например, чтобы найти дни, когда 2 друга были в отпуске:

SELECT dates.d AS "date", COUNT(*) AS num_on_holiday
FROM GENERATE_SERIES((SELECT MIN(start_date) FROM holiday),
                     (SELECT MAX(end_date) FROM holiday),
                     '1 day'::interval) dates(d)
LEFT JOIN holiday h ON dates.d BETWEEN h.start_date AND h.end_date
GROUP BY dates.d
HAVING COUNT(*) = 2
ORDER BY dates.d

Вывод:

date                    num_on_holiday
2012-05-23 00:00:00+01  2
2012-05-25 00:00:00+01  2
2012-05-26 00:00:00+01  2

Демо на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...