PostgreSQL 分区依据 select 具有特定列值的第一行
PostgreSQL partition by and select first row with specific column value
我有以下格式的数据:
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 的编号行。是否可以在分区内做个案例?
您可以使用 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
id | date | metric
-: | :--------- | -----:
1 | 2019-01-01 | 1
2 | null | 0
3 | 2019-03-01 | 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。我想要的输出如下所示:
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 的编号行。是否可以在分区内做个案例?
您可以使用 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
id | date | metric -: | :--------- | -----: 1 | 2019-01-01 | 1 2 | null | 0 3 | 2019-03-01 | 1