分组中第一行和最后一行之间的差异

Dmi*_*kov 1 sql postgresql grouping group-by

我从非常复杂的查询中获取了这张表,也就是说,它不可能自己加入。行按时间降序排列。

type, value, time
+---+----+
| 2 |  2 |
| 2 |  7 |
| 3 | 20 |
| 3 | 16 |
+---+----+ 
Run Code Online (Sandbox Code Playgroud)

我需要计算每个类型分组的第一个和最后一个值之间的差异,在给定的示例中,这会给我

+---+----+
| 2 | -5 |
| 3 | 4  |
+---+----+  
Run Code Online (Sandbox Code Playgroud)

可行吗?

Gor*_*off 5

一种方法使用窗口函数。像这样的工作:

select distinct type,
       (first_value(value) over (partition by type order by time asc) -
        first_value(value) over (partition by type order by time desc)
       ) as diff        
from t;
Run Code Online (Sandbox Code Playgroud)

不幸的是,Postgres 没有first_value()聚合功能。

你也可以使用array_agg()

select distinct type,
       ((array_agg(value order by time asc))[1] -
        (array_agg(value order by time desc))[1]
       ) as diff        
from t
group by type;
Run Code Online (Sandbox Code Playgroud)