ОТЛИЧИТЬ, чтобы найти минимальное и максимальное время - PullRequest
0 голосов
/ 30 октября 2019

Я пытался использовать DISTINCT ON с posrgresql для достижения следующего: допустим, у меня есть таблица, которая выглядит следующим образом:

id  time   price
1   12:00  10
1   13:00  20
1   14:00  30

И моя цель - создать таблицу только с 1 строкой на идентификатор, который показывает столбец минимальной временной цены и максимальной временной цены. Нечто похожее на это:

id  min_time_price  max_time_price
1   10              30

Я пытался использовать DISTINCT ON (id), но не могу его получить.

Хотелось бы помочь, Спасибо!

1 Ответ

0 голосов
/ 30 октября 2019

Вот один метод:

select t.id, tmin.price, tmax.price
from (select t.id, min(time) as min_time, max(time) as max_time
      from t
     ) t join
     t tmin
     on t.id = tmin.id and t.min_time = tmin.time join
     t tmax
     on t.id = tmax.id and t.max_time = tmax.time;

Вы также можете использовать агрегацию. Postgres не имеет first() / last() функций агрегирования, но массивы удобны:

select t.id,
       array_agg(price order by time asc)[1] as min_time_price,
       array_agg(price order by time desc)[1] as max_time_price
from t
group by id;

Или с использованием first_value() и last_value():

select distinct t.id,
       first_value(price) over (partition by time order by time) as min_time_price,
       first_value(price) over (partition by time order by time desc) as max_time_price
from t
...