postgres LAG () использует неправильное предыдущее значение - PullRequest
0 голосов
/ 26 декабря 2018

Возьмите следующие данные и запросы:

create table if not exists my_example(a_group varchar(1)
                        ,the_date date
                        ,metric numeric(4,3)
                        );

INSERT INTO my_example
VALUES ('1','2018-12-14',0.514)
,('1','2018-12-15',0.532)
,('2','2018-12-15',0.252)
,('3','2018-12-14',0.562)
,('3','2018-12-15',0.361);

select
    t1.the_date
    ,t1.a_group
    ,t1.metric AS current_metric
    ,lag(t1.metric, 1) OVER (ORDER BY t1.a_group, t1.the_date) AS previous_metric
from
    my_example t1;

Что дает следующие результаты:

+------------+---------+----------------+-----------------+
|  the_date  | a_group | current_metric | previous_metric |
+------------+---------+----------------+-----------------+
| 2018-12-14 |       1 | 0.514          | NULL            |
| 2018-12-15 |       1 | 0.532          | 0.514           |
| 2018-12-15 |       2 | 0.252          | 0.532           |
| 2018-12-14 |       3 | 0.562          | 0.252           |
| 2018-12-15 |       3 | 0.361          | 0.562           |
+------------+---------+----------------+-----------------+

Я ожидал, что значение previous_metric для одиночной строки a_group==2 будет NULL.Однако, как вы можете видеть, значение отображается как 0.532, которое берется из предыдущего ряда.Как я могу изменить этот запрос, чтобы получить значение NULL, как я ожидал?

1 Ответ

0 голосов
/ 26 декабря 2018

Вам необходимо использовать LAG с разделом на a_group, так как вы хотите, чтобы значения запаздывания были в конкретном кадре:

SELECT
    t1.the_date,
    t1.a_group,
    t1.metric AS current_metric,
    LAG(t1.metric, 1) OVER (PARTITION BY t1.a_group ORDER BY t1.the_date)
        AS previous_metric
FROM my_example t1;
...