sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo etiquetar grupos en postgresql cuando la pertenencia al grupo depende de la línea anterior?

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: