如何选择有序组的第一个和最后一个值?

时间:2018-02-22 04:55:38

标签: sql postgresql

如何在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 |

我尝试使用滞后和铅并获得所需的输出。但是查询变得非常大。还有其他方法吗?

1 个答案:

答案 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