PostgreSQL分区,并选择具有特定列值的第一行

问题描述 投票:1回答:1

我具有以下格式的数据:

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,日期为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仅给我编号行。在分区中通过以下方式可以解决问题吗?

sql postgresql greatest-n-per-group
1个回答
2
投票

您可以使用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

Demo on DB Fiddle

id |日期|公制-:| :--------- | -----:1 | 2019-01-01 | 1个2 |  | 03 | 2019-03-01 | 1个
© www.soinside.com 2019 - 2024. All rights reserved.