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

¿Cómo selecciono eficientemente el valor no nulo anterior?

Encontré esta respuesta para SQL Server que también funciona en Postgres. Como nunca lo había hecho antes, pensé que la técnica era bastante inteligente. Básicamente, crea una partición personalizada para la función de ventana usando una declaración de caso dentro de una consulta anidada que incrementa una suma cuando el valor no es nulo y lo deja solo de lo contrario. Esto permite delinear cada sección nula con el mismo número que el valor no nulo anterior. Aquí está la consulta:

SELECT
  id, value, value_partition, first_value(value) over (partition by value_partition order by id)
FROM (
  SELECT
    id,
    value,
    sum(case when value is null then 0 else 1 end) over (order by id) as value_partition

  FROM p
  ORDER BY id ASC
) as q

Y los resultados:

 id | value | value_partition | first_value
----+-------+-----------------+-------------
  1 |   100 |               1 |         100
  2 |       |               1 |         100
  3 |       |               1 |         100
  4 |       |               1 |         100
  5 |       |               1 |         100
  6 |       |               1 |         100
  7 |       |               1 |         100
  8 |   200 |               2 |         200
  9 |       |               2 |         200
(9 rows)