首页 > 解决方案 > PostgreSQL分区并选择具有特定列值的第一行

问题描述

我有以下格式的数据:

ID      DATE       METRIC
1      1/1/19        1
1      1/3/19        1
1      1/5/19        0
2      1/2/19        0
2      1/9/19        0
2      1/11/19       0
3      1/1/19        0
3      1/2/19        0
3      1/3/19        1

我想要完成的是每个 ID 只取一行,如果有 1 个指标,则第一个日期为 1。如果没有 1 个指标,则取该行并将日期设为 NULL。我想要的输出如下所示:

ID      DATE       METRIC
1      1/1/19        1
2       NULL         0
3      1/3/19        1

我最接近的是做一个row_number() OVER (PARTITION BY ID order by DATE) as RN然而,这只是让我每个 ID 都有编号的行。在分区内时可以做一个案例吗?

标签: sqlpostgresqldategreatest-n-per-groupwindow-functions

解决方案


您可以使用DISTINCT ON条件逻辑:

select distinct on(t.id)
    t.id,
    case when t.metric = 1 then t.date end date,
    metric
from mytable t
order by t.id, t.metric desc, t.date

DB Fiddle 上的演示

编号 | 日期 | 公制
-: | :--------- | -----:
 1 | 2019-01-01 | 1
 2 |        | 0
 3 | 2019-03-01 | 1

推荐阅读