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

Fonctions de fenêtre :last_value(ORDER BY ... ASC) identique à last_value(ORDER BY ... DESC)

Le problème avec LAST_VALUE() est que les règles par défaut pour les clauses de fenêtrage suppriment les valeurs que vous voulez vraiment. Il s'agit d'un problème très subtil et se vérifie dans toutes les bases de données qui prennent en charge cette fonctionnalité.

Cela vient d'un blog Oracle :

Alors que nous sommes sur le sujet des clauses de fenêtrage, la clause de fenêtre implicite et non modifiable pour les fonctions FIRST et LAST est ROWSBETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, c'est-à-dire toutes les lignes de notre partition. Pour FIRST_VALUE et LAST_VALUE, la clause de fenêtrage par défaut mais modifiable est ROWS BETWEEN UNBOUNDED PRECEDINGAND CURRENT ROW. FIRST_VALUE) mais cela fait une différence lorsque nous recherchons la dernière ligne de la liste (LAST_VALUE) vous devrez donc généralement spécifier explicitement ROWS BETWEENUNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING lors de l'utilisation de LAST_VALUE ou simplement utiliser FIRST_VALUE et inverser l'ordre de tri .

Par conséquent, utilisez simplement FIRST_VALUE() . Cela fait ce que vous voulez :

with test (id, session_ID, value) as (
      (VALUES (0, 2, 100),
              (1, 2, 120),
              (2, 2, 140),
              (3, 1, 900),
              (4, 1, 800),
              (5, 1, 500)
      )
     )
select id,
       first_value(value) over (partition by session_ID order by id) as first_value_window,
       first_value(value) over (partition by session_ID order by id desc) as first_value_window_desc
from test
order by id