SQL становится четким, максимальным и идентификатором

#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:

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;