PostgreSQL 9.3, запрос с группировкой, выбор максимума из группы.
Есть таблица с полями url
и created_at
.
В таблице есть множество записей с одинаковым url
. Мне нужно получить записи со самым старшим created_at
, для каждой группы с одинаковым url
. Т.е., имея:
url | created_at
------------------------
abc | 1
abc | 2
def | 3
def | 0
Получить:
url | created_at
------------------------
abc | 2
def | 3
Пробовал сделать это так:
SELECT *
FROM items
GROUP BY url
HAVING created_at = MAX(created_at)
Получаю:
ERROR: column "items.id" must appear in the GROUP BY clause or be used in an aggregate function
Попробовал то же самое немного иначе:
SELECT MAX(created_at) AS last_created_At, *
FROM items
GROUP BY url
HAVING created_at = last_created_at
Получил:
ERROR: column "last_created_at" does not exist
LINE 4: HAVING created_at = last_created_at`
Похоже, я неправильно понимаю, как работает GROUP BY HAVING
. Как мне достичь желаемого?
ДОБАВЛЕНО: Достиг желаемого с помощью вложенного запроса, но вопрос остаётся открытым, как это сделать без него:
SELECT *
FROM items
WHERE created_at = (SELECT MAX(created_at)
FROM items AS t
WHERE t.url = items.url)
Источник: Stack Overflow на русском