„výběr v rámci výběru“ se častěji nazývá „podvýběr“ nebo „poddotaz“. Ve vašem konkrétním případě se jedná o korelovaný poddotaz . LATERAL
spojení (nové v postgresu 9.3) mohou do značné míry nahradit korelované poddotazy flexibilnějšími řešeními:
Myslím, že tady nepotřebujete ani jedno.
Pro váš první případ tento dotaz je však pravděpodobně rychlejší a jednodušší:
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()
počítá pouze nenulové hodnoty, takže grp
se zvyšuje s každou nenulovou value
, čímž se vytvoří skupiny podle potřeby. Je triviální vybrat jeden nenulová value
za grp
ve vnějším SELECT
.
Pro váš druhý případ , budu předpokládat, že počáteční pořadí řádků je určeno (id1, id2, tms)
jak je uvedeno v jednom z vašich dotazů.
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;
Přizpůsobte se vaší skutečné objednávce. Jedna z nich by to mohla pokrýt:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQL Fiddle s rozšířeným příkladem.
Související: