Если вы хотите, чтобы все строки с минимальным значением в группе:
SELECT id, num, dis
FROM table1 T1
WHERE dis = (SELECT MIN(dis) FROM table1 T2 WHERE T1.num = T2.num)
Или вы можете использовать соединение, чтобы получить тот же результат:
SELECT T1.id, T1.num, T1.dis
FROM table1 T1
JOIN (
SELECT num, MIN(dis) AS dis
FROM table1
GROUP BY num
) T2
ON T1.num = T2.num AND T1.dis = T2.dis
Если вам нужна только одна строка из каждой группы, даже если есть связи, вы можете использовать это:
SELECT id, dis, num FROM (
SELECT id, dis, num, ROW_NUMBER() OVER (PARTITION BY num ORDER BY dis) rn
FROM table1
) T1
WHERE rn = 1
К сожалению, это будет не очень эффективно. Если вам нужно что-то более эффективное, см. Страницу Quassnoi на , в которой выбираются строки с групповым максимумом для PostgreSQL . Здесь он предлагает несколько способов выполнения этого запроса и объясняет производительность каждого из них. Резюме из статьи выглядит следующим образом:
В отличие от MySQL, PostgreSQL реализует
несколько чистых и документированных способов
выберите записи, ведущие по группам
максимумы, включая оконные функции
и различаются.
Однако из-за отсутствия свободного индекса
поддержка сканирования PostgreSQL
оптимизатор и менее эффективное использование
индексов в PostgreSQL, запросы
использование этих функций занимает слишком много времени.
Чтобы обойти эти проблемы и
улучшить запросы по сравнению с низким
условия группировки мощности, а
определенное решение, описанное в
статья должна быть использована.
Это решение использует рекурсивные CTE для
эмулировать свободное сканирование индекса и очень
эффективен, если столбцы группировки имеют
низкая мощность.