#sql #postgresql #max #distinct
Вопрос:
У меня есть таблица под названием версии, и я пытаюсь получить идентификатор, тело и самую высокую версию. Я использую Postgres
Когда я использую
SELECT DISTINCT(body), MAX(version) FROM versions
WHERE body = 'Maintain records of all disclosures'
GROUP BY body
Когда я пытаюсь добавить идентификатор
SELECT DISTINCT(body), MAX(version), id FROM versions
WHERE body = 'Maintain records of all disclosures'
GROUP BY body, id
Я получаю
Что мне нужно изменить, чтобы я получал только идентификатор, где макс самый высокий?
Комментарии:
1. Не могли бы вы, пожалуйста, указать базу данных, которую вы используете. Например, в SQL Server вы можете ВЫБРАТЬ ВЕРХНИЙ 1 * ИЗ ПОРЯДКА ТАБЛИЦ ПО ВЕРСИИ DESC
2. @Сергей Я обновил пост. Я использую Postgres
3. Вы пробовали ВЫБРАТЬ тело,версию, идентификатор из версий, ГДЕ тело = «Ведение записей обо всех раскрытиях» порядок по версии ограничение 1
Ответ №1:
Вы могли бы сделать что-то вроде этого:
SELECT body, version, id
FROM versions
WHERE version = (
SELECT MAX(version)
FROM versions
WHERE body = 'Maintain records of all disclosures')
AND body = 'Maintain records of all disclosures'
Ответ №2:
- использование функций Windows для получения максимального https://www.sqlshack.com/use-window-functions-sql-server/
- использование номера строки для удаления дураков
https://www.sqlservercentral.com/articles/eliminating-duplicate-rows-using-the-partition-by-clause
WITH DATA AS (
SELECT BODY,
ID,
MAX(version) OVER(PARITION BY BODY ORDER BY ID) AS MAX_VERSION,
ROW_NUMBER() OVER(PARTITION BY BODY ORDER BY ID) AS ROW_NUM
FROM versions
WHERE body = 'Maintain records of all disclosures'
)
SELECT
*
FROM DATA
WHERE ROW_NUM = 1
Ответ №3:
Если я правильно понимаю, вы хотите distinct on
:
SELECT DISTINCT ON (v.body), v.*
FROM versions v
WHERE v.body = 'Maintain records of all disclosures'
ORDER BY body, version DESC;
Однако, если в результирующем наборе требуется только одна строка, LIMIT
достаточно:
SELECT v.*
FROM versions v
WHERE v.body = 'Maintain records of all disclosures'
ORDER BY body, version DESC
LIMIT 1;