Ein "Auswahl innerhalb einer Auswahl" wird häufiger als "subselect" oder "subquery" bezeichnet. In Ihrem speziellen Fall handelt es sich um eine korrelierte Unterabfrage . LATERAL
Joins (neu in Postgres 9.3) können korrelierte Unterabfragen weitgehend durch flexiblere Lösungen ersetzen:
Ich glaube nicht, dass Sie beides hier brauchen.
Für Ihren ersten Fall Diese Abfrage ist jedoch wahrscheinlich schneller und einfacher:
SELECT date, max(value) OVER (PARTITION BY grp) AS value
FROM (
SELECT *, count(value) OVER (ORDER BY date) AS grp
FROM test_fill_null
) sub;
count()
zählt nur Nicht-Null-Werte, also grp
wird mit jedem value
ungleich Null erhöht , wodurch wie gewünscht Gruppen gebildet werden. Es ist trivial, den einen auszuwählen Nicht-Null-value
pro grp
im äußeren SELECT
.
Für Ihren zweiten Fall , gehe ich davon aus, dass die anfängliche Reihenfolge der Zeilen durch (id1, id2, tms)
bestimmt wird wie in einer Ihrer Abfragen angegeben.
SELECT id1, id2, tms
, count(step) OVER (ORDER BY id1, id2, tms) AS group_id
FROM (
SELECT *, CASE WHEN lag(tms, 1, '-infinity') OVER (PARTITION BY id1 ORDER BY id2, tms)
< tms - interval '5 min'
THEN true END AS step
FROM table0
) sub
ORDER BY id1, id2, tms;
An Ihre tatsächliche Bestellung anpassen. Eine davon könnte es abdecken:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQL-Fiddle mit einem erweiterten Beispiel.
Verwandte: