PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como seleciono com eficiência o valor não nulo anterior?


Encontrei esta resposta para o SQL Server que também funciona no Postgres. Nunca tendo feito isso antes, achei a técnica bastante inteligente. Basicamente, ele cria uma partição personalizada para a função de janela usando uma instrução case dentro de uma consulta aninhada que incrementa uma soma quando o valor não é nulo e o deixa em paz caso contrário. Isso permite delinear cada seção nula com o mesmo número que o valor não nulo anterior. Aqui está a 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

E os 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)