Ett "välj inom ett urval" kallas oftare "subselect" eller "subquery" I ditt specifika fall är det en korrelerad underfråga . LATERAL
joins (ny i postgres 9.3) kan till stor del ersätta korrelerade underfrågor med mer flexibla lösningar:
Jag tror inte att du behöver det heller här.
För ditt första fall den här frågan är förmodligen snabbare och enklare, dock:
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()
Räknar bara icke-nullvärden, så grp
ökas med varje value
som inte är null och bildar därigenom grupper efter önskemål. Det är trivialt att välja en icke-null value
per grp
i den yttre SELECT
.
För ditt andra fall , jag antar att den initiala ordningen på raderna bestäms av (id1, id2, tms)
som indikeras av en av dina frågor.
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;
Anpassa till din faktiska beställning. En av dessa kan täcka det:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQL Fiddle med ett utökat exempel.
Relaterat: