PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment sélectionner efficacement la valeur non nulle précédente ?

J'ai trouvé cette réponse pour SQL Server qui fonctionne également dans Postgres. N'ayant jamais fait cela auparavant, je pensais que la technique était assez astucieuse. Fondamentalement, il crée une partition personnalisée pour la fonction de fenêtrage en utilisant une instruction case à l'intérieur d'une requête imbriquée qui incrémente une somme lorsque la valeur n'est pas nulle et la laisse seule sinon. Cela permet de délimiter chaque section nulle avec le même numéro que la valeur non nulle précédente. Voici la requête :

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

Et les résultats :

 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)