我需要计算在类别上分组的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可以在一个查询中执行此操作吗?
答案 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;