У меня есть стол в форме

USER  |VALUE |DATE
-------------------------
user1 | 1337 | 2019-11-01
user1 | 1338 | 2019-03-28
user2 | 1234 | 2019-04-23
user2 | 4567 | 2019-05-05

И хотите получить максимальное значение каждого пользователя с соответствующей датой. Когда я делаю что-то вроде

SELECT max(VALUE) FROM table
GROUP BY USER

У меня проблема в том, что я не могу ни агрегировать, ни группировать по ДАТЕ. Как я могу сказать PostgreSQL, что я просто хочу иметь дату, связанную со строкой, где макс. значение есть?

Благодарность!

0
gizarmaluke 10 Дек 2019 в 17:04

2 ответа

Нажмите: демонстрация: db <> скрипка

Вы можете использовать DISTINCT ON: это дает вам первую запись упорядоченной группы. В вашем случае группы - это ваш user столбец. Вы должны сделать заказ value DESC, чтобы получить максимальную value первую запись. Это будет принято - включая соответствующее значение date.

SELECT DISTINCT ON (user)
    *
FROM 
    mytable
ORDER BY user, value DESC
1
S-Man 10 Дек 2019 в 14:16

Если вам нужны другие агрегаты в запросе, вы также можете использовать array_agg() для имитации «первой» функции:

select user, max(value), count(*),
       (array_agg(date order by value desc))[1] as date_at_max
from t
group by user;
0
Gordon Linoff 10 Дек 2019 в 14:13