我真的沒有看到使用generate_series
的一點。
爲了得到結果,你提出你可以使用ROW_NUMBER
和自聯接:
CREATE TABLE tab(cleaning timestamp);
INSERT INTO tab(cleaning)
VALUES ('2015-03-01 00:00'), ('2015-05-31 00:00'), ('2015-06-13 00:00');
主查詢:
WITH cte AS
(
SELECT cleaning, ROW_NUMBER() OVER(ORDER BY cleaning) AS rn
FROM tab
)
SELECT COALESCE(c1.cleaning,'0001-01-01'::timestamp) AS start_date,
COALESCE(c2.cleaning,CURRENT_TIMESTAMP) AS end_date
FROM cte c1
FULL JOIN cte c2
ON c1.rn = c2.rn-1
ORDER BY start_date;
SqlFiddleDemo
輸出:
╔═══════════════════════════╦═════════════════════════╗
║ start_date ║ end_date ║
╠═══════════════════════════╬═════════════════════════╣
║ January, 01 0001 00:00:00 ║ March, 01 2015 00:00:00 ║
║ March, 01 2015 00:00:00 ║ May, 31 2015 00:00:00 ║
║ May, 31 2015 00:00:00 ║ June, 13 2015 00:00:00 ║
║ June, 13 2015 00:00:00 ║ March, 30 2016 11:03:38 ║
╚═══════════════════════════╩═════════════════════════╝
編輯:
另一種可能性是使用LAG/LEAD
窗口功能:
SELECT COALESCE(LAG(cleaning) OVER(ORDER BY cleaning), '0001-01-01'::timestamp)
AS start_date
,cleaning AS end_date
FROM tab
UNION ALL
SELECT MAX(cleaning), CURRENT_TIMESTAMP
FROM tab
ORDER BY start_date;
SqlFiddleDemo2
'0000-00-00 00:00'是一個無效的日期 –