Postgresql - разница в значении между двумя последовательными строками, сгруппированными по категориям - PullRequest
0 голосов
/ 25 апреля 2018

Мне нужно вычислить разницу значений между самыми последними и последними самыми последними строками в таблице Postgres, сгруппированной по категории.Вот таблица:

category    timestamp   value
----------  ----------  -----
A           2018-04-09      5
B           2018-04-09      3
A           2018-04-12      2
A           2018-04-15      4
B           2018-04-25      8
C           2018-04-16      7

Запрос должен сгруппироваться по категориям, упорядоченным по отметке времени (по убыванию), и вычислить разницу значений в двух верхних строках.Поскольку для C существует только одна строка, ее следует игнорировать.Таким образом, запрос должен возвращать следующий набор результатов:

category  diff
--------  ----
A            2
B            5

Таким образом, строки сгруппированы по категориям, а разница значений берется для тех категорий, для которых существует как минимум две или более строк.В то время как категория C игнорируется, поскольку в ней нет еще двух строк.Строки расположены в порядке убывания метки времени.Наконец, результаты упорядочены по категориям.

Может ли Postresql сделать это за один запрос?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете подойти к этому, используя row_number():

select category,
       sum(case when seqnum = 1 then value else - value end) as diff
from (select t.*,
             row_number() over (partition by category order by timestamp) as seqnum
      from t
     ) t
where seqnum in (1, 2)
group by category
having count(*) > 1;
...