„Избиране в рамките на избрано“ по-често се нарича "подизбор" или "подзаявка". Във вашия конкретен случай това е свързана подзаявка . LATERAL
присъединяванията (нови в postgres 9.3) могат до голяма степен да заменят корелирани подзаявки с по-гъвкави решения:
Не мисля, че имате нужда от двете тук.
За вашиятпърви случай тази заявка обаче вероятно е по-бърза и по-проста:
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()
брои само ненулеви стойности, така че grp
се увеличава с всяка ненулева value
, като по този начин формират групи по желание. Тривиално е да изберете един ненулева value
за grp
във външния SELECT
.
За вашият втори случай , ще приема, че първоначалният ред на редовете се определя от (id1, id2, tms)
както е посочено в едно от вашите запитвания.
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;
Адаптирайте се към вашата действителна поръчка. Едно от тях може да го покрие:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQL Fiddle с разширен пример.
Свързани: