目前,我正在使用PostgreSQL实现数据库。我有以下数据库(希望ER图完全描述它)
关于数据库,您需要知道的是,朋友可以休息一下,并有一个假期,假期由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')。
您可以使用GENERATE_SERIES
生成最早的GENERATE_SERIES
和最新的start_date
之间的所有日期的列表,然后从end_date
生成到LEFT JOIN
,以查找在给定假期中所有休假的朋友日期。然后,您可以对它们进行计数并根据结果进行过滤。例如,要查找2个朋友度假的日子:
holiday
输出:
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