如何在postgresql中选择有序组的第一个和最后一个值
例如
| col1 | col2 |
|:----:|---------------------|
| A | 2018-02-21 01:00:01 |
| A | 2018-02-21 13:00:01 |
| A | 2018-02-21 14:00:01 |
| B | 2018-02-21 16:00:01 |
| B | 2018-02-22 06:00:01 |
| A | 2018-02-22 10:00:01 |
| A | 2018-02-23 11:00:01 |
| C | 2018-02-24 15:00:01 |
输出:
| col1 | first_value | last_value |
|:----:|---------------------|---------------------|
| A | 2018-02-21 01:00:01 | 2018-02-21 14:00:01 |
| B | 2018-02-21 16:00:01 | 2018-02-22 06:00:01 |
| A | 2018-02-22 10:00:01 | 2018-02-23 11:00:01 |
| C | 2018-02-24 15:00:01 | 2018-02-24 15:00:01 |
我尝试使用滞后和铅并获得所需的输出。但是查询变得非常大。还有其他方法吗?
答案 0 :(得分:0)
使用row_numbers
的差异来获取第一个和最后一个值
select col1, min(col2) first_value, max(col2) last_value
from
(
select *,
rank() over (order by col1, cast(col2 as date)) sq1,
dense_rank() over (order by col1, cast(col2 as date)) sq2
from table t
) a
group by col1, (sq1-sq2)
order by min(col2)
运行派生表查询以查看生成序列的内容以及用于分组的方式。
结果:
col1 first_value last_value
A 2018-02-21 01:00:01.000 2018-02-21 14:00:01.000
B 2018-02-21 16:00:01.000 2018-02-22 06:00:01.000
A 2018-02-22 10:00:01.000 2018-02-23 11:00:01.000
C 2018-02-24 15:00:01.000 2018-02-24 15:00:01.000