2016-03-30 6 views
2

Hallo Ich möchte dynamische Zeiten Serie mit generate_series in Postgresql machen.Postgresql generate_series dynamische Intervall

Zum Beispiel habe ich eine Menge von Zufalls aktuelle Liste bekam:

cleaning date 
2015-03-01 00:00 
2015-05-31 00:00 
2015-06-13 00:00 

und ich möchte, um dynamisch das Datum Zeitraum von dieser Reinigungsdaten aufgeteilt.

Das Ergebnis wird so aussehen:

start date   end date 
0000-00-00 00:00 2015-03-01 00:00 
2015-03-01 00:00 2015-05-31 00:00 
2015-05-31 00:00 2015-06-13 00:00 
2015-06-13 00:00 (current_timestamp) 

ich keine Ahnung habe, wie ich dynamisches Intervall in generate_series ... Ist das möglich durch generate_series?

+2

'0000-00-00 00: 00 'ist ein ungültiger Datum –

Antwort

0

Ich sehe wirklich keinen Sinn der Verwendung generate_series.

Um zur Folge, dass Sie vorgeschlagen Sie ROW_NUMBER und Selbstverknüpfung verwenden:

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'); 

Haupt query:

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

Ausgang:

╔═══════════════════════════╦═════════════════════════╗ 
║  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 ║ 
╚═══════════════════════════╩═════════════════════════╝ 

EDIT:

Eine andere Möglichkeit ist LAG/LEAD Fensterfunktionen zu verwenden:

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