【发布时间】:2014-12-16 02:07:45
【问题描述】:
假设您有以下列出预订日期的 PostgreSQL 稀疏表:
CREATE TABLE reserved_dates (
reserved_days_id SERIAL NOT NULL,
reserved_date DATE NOT NULL
);
INSERT INTO reserved_dates (reserved_date) VALUES
('2014-10-11'),
('2014-10-12'),
('2014-10-13'),
-- gap
('2014-10-15'),
('2014-10-16'),
-- gap
('2014-10-18'),
-- gap
('2014-10-20'),
('2014-10-21');
您如何将这些日期聚合成连续的日期范围(没有间隔的范围)?如:
start_date | end_date
------------+------------
2014-10-11 | 2014-10-13
2014-10-15 | 2014-10-16
2014-10-18 | 2014-10-18
2014-10-20 | 2014-10-21
这是我目前想出的,但我只能通过这种方式获得start_date:
WITH reserved_date_ranges AS (
SELECT reserved_date,
reserved_date
- LAG(reserved_date) OVER (ORDER BY reserved_date) AS difference
FROM reserved_dates
)
SELECT *
FROM reserved_date_ranges
WHERE difference > 1 OR difference IS NULL;
【问题讨论】:
-
关键字是 calendar table ,在你的情况下:: generate_series() left join YourTable,基本上。
-
好吧,我会这样用中间日期来填补空白。我如何从中获取日期范围?
标签: sql postgresql time-series aggregate-functions window-functions