Marcin
Miga
Programista. Po
prostu programista.
Temat: postgreSQL first_value, last_value
begin
;
/*
create temp table wymiary
(
id serial not null primary key,
osoba_id integer not null,
data_pomiaru date not null,
wynik integer not null,
unique(osoba_id, data_pomiaru)
)
on commit drop;
insert into wymiary(osoba_id, data_pomiaru, wynik) values
(1, '20100101', 60), (1, '20140101', 120), (1, '20120101', 100), (1, '20110701', 85),
(2, '20130101', 90), (2, '20140101', 120), (2, '20120101', 50), (2, '20140701', 180),
(3, '20120101', 60), (3, '20140101', 100), (3, '20110101', 10), (3, '20130101', 70)
;
*/
select
*,
first_value(wynik) over(partition by osoba_id order by data_pomiaru) pierwszy_wynik,
first_value(wynik) over(partition by osoba_id order by data_pomiaru DESC) pierwszy_wynik_od_konca,
last_value(wynik) over(partition by osoba_id order by data_pomiaru) ostatni_wynik
from wymiary
order by osoba_id, data_pomiaru;
Dlaczego wartość "pierwszy_wynik_od_konca" jest obliczana prawidłowo, a "ostatni_wynik" nie? Na logikę powinny zwracać to samo, a tak nie jest.
Aby tak było trzeba dodać 'ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING', ale dlaczego trzeba to przy last_, a przy first_ nie?