sql для поиска самой последней записи в группе - PullRequest
2 голосов
/ 06 июля 2011

у меня есть таблица, как такая

table_id | series_id | revision_id | year
------------------------------------------
1        | 1         | 1           | 2010
2        | 2         | 1           | 2009
3        | 2         | 2           | 2008
4        | 2         | 2           | 2009
5        | 2         | 3           | 2010
6        | 2         | 3           | 2008
7        | 3         | 2           | 2007
8        | 3         | 3           | 2010
9        | 3         | 3           | 2010

Мне нужно найти table_id для максимума (года) при группировке по revision_id, когда ряд = X в postgresql.

Например: когда x = 2, я ожидаю этого результата

table_id | series_id | revision_id | year
------------------------------------------
2        | 2         | 1           | 2009
4        | 2         | 2           | 2009
5        | 2         | 3           | 2010

это не работает

SELECT * from table 
WHERE series_id = 2 
AND table_id IN (
    SELECT table_id 
    FROM table 
    WHERE series_id = 2 
    GROUP by revision 
    ORDER BY year DESC
)

Я не могу найти способ сделать это в postgresql, так как мне нужно вернуть поле, которое я не группирую по

Вот некоторые похожие проблемы в других разновидностях SQL.

MySQL SQL-запрос, выбор 5 самых последних в каждой группе

SQL SERVER SQL Server - Как выбрать самую последнюю запись для пользователя?

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Запрос:

SELECT table_id, series_id, revision_id, year
FROM tableName t INNER JOIN
    (SELECT revision_id, max(year) AS year
    FROM tableName 
    WHERE series_id = 2 
    GROUP BY revision_id) s
USING (revision_id, year)
WHERE series_id = 2;

Результат:

 table_id | series_id | revision_id | year
----------+-----------+-------------+------
        2 |         2 |           1 | 2009
        4 |         2 |           2 | 2009
        5 |         2 |           3 | 2010
(3 rows)
2 голосов
/ 06 июля 2011

Хмм ... Попробуйте это:

SELECT *
FROM table as a
WHERE series_id = ?
AND year = (SELECT MAX(year)
            FROM table as b
            WHERE a.series_id = b.series_id
            AND a.revision_id = b.revision_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...