postgresql Выберите все строки, которые имеют максимальное значение в одном столбце - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в postgresql, у меня есть таблица T, подобная этой, в postgresql:

C1 C2 C3 C4 ID

C1, C2, C4 - целые числа.
C3 - это символ C4, по сути, номер версии,и может быть любым между 1-N.
(Например, после одного набора событий вставки значения в таблице обновляются.) ID - это символ.

Вопрос:
Для заданного значения идентификатора я хочу выбрать все строки, с которыми связан самый высокий C4.Например, в таблице может быть N версий, я хочу, чтобы все результаты соответствовали версии N.

Я пытался
select C1,C2,C3, max(C4) from T where ID = 'something';

, но это выдает ошибку.

Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 25 апреля 2018

Если может быть несколько строк для одного и того же номера версии, тогда используйте оконную функцию RANK в cte и выберите строки, где ранг равен 1

SELECT id, c1, c2, c3, c4 
FROM (
    SELECT 
      *
    , RANK() OVER (PARTITION BY id ORDER BY c4 DESC) c4rank
    FROM t
) ranked 
WHERE c4rank = 1
  AND id = 'something'

Если вы хотите самую последнюю версиюдля всех идентификаторов просто опустите условие id = 'something' из вышеприведенного оператора.

Если для данного номера версии может быть только 1 строка, используйте order by и ограничьте 1

SELECT id, c1, c2, c3, c4
FROM t
WHERE id = 'something'
ORDER BY c4 DESC
LIMIT 1

Если вам нужна самая последняя версия для всех идентификаторов, в каждой комбинации (идентификатор, версия) может быть только 1 строка

SELECT DISTINCT ON (id) id, c1, c2, c3, c4
FROM t
WHERE id = 'something'
ORDER BY id, c4 DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...