PostgreSQL разделить и выбрать первую строку с указанным c значением столбца - PullRequest
1 голос
/ 22 января 2020

У меня есть данные в следующем формате:

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

То, что я пытаюсь выполнить sh - это взять только одну строку для каждого идентификатора и, если есть 1 метри c, взять первую дату с 1. Если нет 1 метри c, возьмите строку и 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, но это оставляет мне пронумерованные строки для каждого идентификатора. Можно ли сделать случай, когда внутри раздела?

1 Ответ

2 голосов
/ 22 января 2020

Вы можете использовать DISTINCT ON и условные логи c:

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 :

id | date       | metric
-: | :--------- | -----:
 1 | 2019-01-01 |      1
 2 | <em>null</em>       |      0
 3 | 2019-03-01 |      1
...