PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come faccio a selezionare in modo efficiente il precedente valore non nullo?

Ho trovato questa risposta per SQL Server che funziona anche in Postgres. Non avendolo mai fatto prima, ho pensato che la tecnica fosse abbastanza intelligente. Fondamentalmente, crea una partizione personalizzata per la funzione di windowing utilizzando un'istruzione case all'interno di una query nidificata che incrementa una somma quando il valore non è null e lo lascia da solo altrimenti. Ciò consente di delineare ogni sezione nulla con lo stesso numero del precedente valore non nullo. Ecco la domanda:

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 i risultati:

 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)