„wybór w ramach wyboru” częściej nazywa się „podwybór” lub „podzapytanie” W Twoim konkretnym przypadku jest to skorelowane podzapytanie . LATERAL
złączenia (nowość w postgresie 9.3) mogą w dużej mierze zastąpić skorelowane podzapytania bardziej elastycznymi rozwiązaniami:
Myślę, że nie potrzebujesz tutaj.
Dla Twojego pierwszego przypadku to zapytanie jest jednak prawdopodobnie szybsze i prostsze:
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()
liczy tylko wartości inne niż null, więc grp
jest zwiększana o każdą niepustą value
, tworząc w ten sposób grupy według potrzeb. Wybór jednego jest trywialny niepusta value
na grp
w zewnętrznym SELECT
.
W drugim przypadku , przyjmę, że początkowa kolejność wierszy jest określona przez (id1, id2, tms)
zgodnie z jednym z Twoich zapytań.
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;
Dostosuj się do aktualnego zamówienia. Jeden z nich może to obejmować:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
Skrzypce SQL z rozszerzonym przykładem.
Powiązane: