sql >> Databáze >  >> RDS >> PostgreSQL

Funkce okna:last_value(ORDER BY ... ASC) stejné jako last_value(ORDER BY ... DESC)

Problém s LAST_VALUE() je, že výchozí pravidla pro klauzule okénka odstraňují hodnoty, které skutečně chcete. Toto je velmi jemný problém a platí pro všechny databáze, které tuto funkci podporují.

Toto pochází z blogu Oracle:

Zatímco jsme u tématu klauzulí pro vytváření oken, implicitní a neměnná klauzule okna pro funkce FIRST a LAST je ŘÁDKYBETWEEN NEBOUNDED PRECEDING A UBOUNDED FOLLOWING, jinými slovy všechny řádky v našem oddílu. Pro FIRST_VALUE a LAST_VALUE je výchozí, ale měnitelná klauzule okénka ROWS BETWEEN NEBOUNDED PRECEDING AND CURRENT ROW, jinými slovy vyloučíme řádky za aktuálním řádkem. Vypuštění řádků ze spodní části seznamu nemá žádný rozdíl, když hledáme první řádek v seznamu ( FIRST_VALUE), ale je to rozdíl, když hledáme poslední řádek v seznamu (LAST_VALUE) takže obvykle budete muset buď zadat ŘÁDKY BETWEENUNBOUNDED PRECEDING A NEBOUNDED FOLLOWING explicitně, když použijete LAST_VALUE, nebo stačí použít FIRST_VALUE a obrátit pořadí řazení .

Proto stačí použít FIRST_VALUE() . Toto dělá, co chcete:

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


  1. Advanced MySql Query:Aktualizace tabulky informacemi z jiné tabulky

  2. Jak uložit výsledek dotazu MySQL do souboru .CSV

  3. Je možné spustit skript SQLPLUS na souboru kódovaném jako UTF-8 s kusovníkem

  4. Změna z SQLite na PostgreSQL v novém projektu Rails