Postgresql - 按类别分组的两个连续行之间的值差异

时间:2018-04-25 16:59:54

标签: sql postgresql select

我需要计算在类别上分组的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 :(得分:0)

您可以使用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;