Una "selección dentro de una selección" se denomina más comúnmente "subselección" o "subconsulta" En su caso particular, es una subconsulta correlacionada . LATERAL
las uniones (nuevas en postgres 9.3) pueden reemplazar en gran medida las subconsultas correlacionadas con soluciones más flexibles:
No creo que necesites ninguno aquí.
Para su primer caso Sin embargo, esta consulta es probablemente más rápida y sencilla:
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()
solo cuenta valores no nulos, por lo que grp
se incrementa con cada value
no nulo , formando así grupos como se desee. Es trivial elegir el uno value
no nulo por grp
en el exterior SELECT
.
Para su segundo caso , asumiré que el orden inicial de las filas está determinado por (id1, id2, tms)
como lo indica una de sus consultas.
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;
Adaptarse a su pedido real. Uno de estos podría cubrirlo:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQL Fiddle con un ejemplo extendido.
Relacionado: