Het probleem met LAST_VALUE()
is dat de standaardregels voor vensterclausules de waarden verwijderen die u echt wilt. Dit is een heel subtiel probleem en geldt voor alle databases die deze functionaliteit ondersteunen.
Dit komt van een Oracle-blog:
Nu we het toch over vensterclausules hebben, de impliciete en onveranderlijke vensterclausule voor de EERSTE en LAATSTE functies is ROWSBETWEEN UNBOUNDED PRECEDING EN UNBOUNDED FOLLOWING, met andere woorden alle rijen in onze partitie. Voor FIRST_VALUE en LAST_VALUE is de standaard maar veranderbare vensterclausule RIJEN TUSSEN UNBOUNDED PRECEDINGAND CURRENT ROW, met andere woorden, we sluiten rijen na de huidige uit. FIRST_VALUE), maar het maakt wel verschil wanneer we naar de laatste rij in de lijst zoeken (LAST_VALUE) dus je zult meestal ofwel RIJEN TUSSEN ONBOND VOORAFGAANDE EN ONGEKENDE VOLGENDE expliciet moeten specificeren wanneer je LAST_VALUE gebruikt of gewoon FIRST_VALUE gebruiken en de sorteervolgorde omkeren .
Gebruik daarom gewoon FIRST_VALUE()
. Dit doet wat je wilt:
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