2017-08-03 4 views
0

Ich habe eine Tabelle, die wie folgt aussieht:Postgres Zeitraum Abfrage

index | timestamp   | type | value 
------- | ----------------- | ---- | ----- 
    1  | 2014-07-10 10:00 | A | 56 
    2  | 2014-07-10 11:04 | B | 69 
    3  | 2014-07-10 11:06 | C | 68 
    4  | 2014-07-10 10:03 | B | 60 
    5  | 2014-07-11 10:03 | B | 18 
    6  | 2014-07-11 11:03 | C | 48 

Ich bin bereit, über einen Zeitraum von Werten für bestimmte ‚Typen‘ zu wählen.

Das Problem ist, dass ich auch das Ergebnis benötigen, um den letzten Wert jedes Typs vor dem ausgewählten Zeitraum zu beginnen.

Eine Idee, wenn es möglich ist, mit einer einzigen Abfrage (oder einer Liste begrenzte Anzahl von Abfragen) zu erreichen?

Dank Meir

+0

bitte oben erwartetes Ergebnis für den Datensatz hinzufügen. –

+0

Auswahl aller Typen für perid 'timestamp> = '2014-07-11'', ich möchte alle Zeilen außer 4 haben (weil der letzte Wert des Typs B vor 2014-07-11 in Zeile 2 ist) – Miro

Antwort

0

Sie Fensterfunktion verwenden können, insbesondere Rang():

https://www.postgresql.org/docs/current/static/tutorial-window.html

Sie haben some wie:

select * from (
    select ...., rank() over (partition by type order by timestamp desc) as rk 
    where ... 
) where rk=1; 

Ich erinnere mich nicht, wenn Sie kann 'rk' in eine 'have' Klausel der inneren Abfrage setzen, aber ich bin mir ziemlich sicher, dass ich das schon einmal probiert habe, und postgres tat es nicht akzeptieren, dass

1

Schließlich fand ich meine eigene Antwort

SELECT timestamp, type, value 
FROM table 
where timestamp >= '2014-07-11' 
UNION ALL 
SELECT distinct on (type) timestamp, type, value 
FROM table 
where timestamp < '2014-07-11' 
ORDER BY type, timestamp desc