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

标签 sql postgresql group-by grouping

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

type, value, time
+---+----+
| 2 |  2 |
| 2 |  7 |
| 3 | 20 |
| 3 | 16 |
+---+----+ 

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

+---+----+
| 2 | -5 |
| 3 | 4  |
+---+----+  

是否可行?

最佳答案

一种方法使用窗口函数。像这样的东西有效:

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;

不幸的是,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;

关于sql - 分组中第一行和最后一行之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045405/

相关文章:

sql - 在单个查询中具有不同约束的不同表上的多个 select 语句,没有结果显示为空值

sql - PostgreSQL 列 'foo' 不存在

postgresql - hstore内部是如何存储数据的?

ruby-on-rails - Ruby/Rails - 按性能分组

mysql - MySQL中如何计算反向运行和

python - 在 Python 中分组并添加新的计算列

mysql - 类别和子类别sql顺序排序

mysql - 有条件地将一个键链接到两个表

java - 如何将 sql 查询的结果发布到 servlet 中?

PHP数组变成一个字符串