Et "vælg i et udvalg" kaldes mere almindeligt "subselect" eller "subquery" I dit særlige tilfælde er det en korreleret underforespørgsel . LATERAL
joins (nyt i postgres 9.3) kan stort set erstatte korrelerede underforespørgsler med mere fleksible løsninger:
Jeg tror heller ikke du behøver her.
Til dit første tilfælde denne forespørgsel er sandsynligvis hurtigere og enklere, selvom:
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()
tæller kun værdier, der ikke er nul, så grp
øges med hver ikke-null value
og derved danne grupper efter ønske. Det er trivielt at vælge den en ikke-null value
pr. grp
i den ydre SELECT
.
Til dit andet tilfælde , antager jeg, at den indledende rækkefølge af rækker er bestemt af (id1, id2, tms)
som angivet af en af dine forespørgsler.
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;
Tilpas til din faktiske ordre. En af disse kan dække det:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQL Fiddle med et udvidet eksempel.
Relateret: