Postgres выбрать все столбцы, но сгруппировать по одному столбцу - PullRequest
11 голосов
/ 30 сентября 2011

У меня есть простая таблица с идентификатором unit_id, меткой времени, байтой диаграммы.Первичный ключ представляет собой сочетание времени и unit_id.

Идея этого запроса состоит в том, чтобы получить самую последнюю строку (наибольшую метку времени) для каждого уникального unit_id.Однако строки для каждого unit_id с самым последним временем не всегда возвращаются.

Я действительно хочу сгруппировать только по unit_id, но postgres заставляет меня также использовать diag, так как я выбираю это.

SELECT DISTINCT ON(unit_id) max(time) as time, diag, unit_id 
FROM diagnostics.unit_diag_history  
GROUP BY unit_id, diag

Ответы [ 2 ]

17 голосов
/ 30 сентября 2011

Каждый раз, когда вы начинаете думать, что хотите локализовать GROUP BY, вы должны начать думать о оконных функциях .

Я думаю, что вы что-то вроде этого:1006 *

Возможно, вы захотите добавить что-то в ORDER BY для последовательного разрыва связей, но это не изменит общую технику.

13 голосов
/ 30 сентября 2011

Вы можете объединить сгруппированный выбор с исходной таблицей:

SELECT d.time, d.diag, d.unit_id
FROM(
    SELECT unit_id, max(time) as max_time
    FROM diagnostics.unit_diag_history
    GROUP BY unit_id
) s JOIN diagnostics.unit_diag_history d
ON s.unit_id = d.unit_id AND s.max_time = d.time
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...