SQL GROUP BY вопрос - PullRequest
       9

SQL GROUP BY вопрос

2 голосов
/ 12 января 2011

У меня есть таблица:

id group data<br> 1 a 10<br> 2 a 20<br> 3 b 10<br> 4 b 20<br>

Я хочу получить идентификаторы записей с максимальным значением «data», сгруппированным по «group», т.е.

id<br> 2<br> 4<br>

Ответы [ 3 ]

5 голосов
/ 12 января 2011

Более современный ответ с использованием CTE:

;WITH Numbered as (
    SELECT ID,ROW_NUMBER() OVER (PARTITION BY group ORDER BY data desc) rn FROM Table
)
SELECT ID from Numbered where rn=1

PostgreSQL имеет довольно приличную документацию в Интернете, посмотрите оконные функции и С запросами .В этом случае мы разбиваем строки в таблице на основании того, к какой группе они принадлежат.Внутри каждого раздела мы нумеруем строки на основе их столбца данных (номер строки 1 присваивается наибольшему значению данных).

Во внешнем запросе мы просто запрашиваем строки, которым был присвоен номер строки 1внутри их раздела, который, если вы следуете логике, должен быть максимальным значением данных в каждой группе.

Если вам нужно иметь дело со связями (т. е. если несколько строк в группе имеют максимальное значение данных длягруппа, и вы хотите, чтобы оба появились в вашем наборе результатов), вы можете переключиться с ROW_NUMBER() на RANK()

4 голосов
/ 12 января 2011

Переносимое решение:

SELECT T1.id
FROM yourtable T1
JOIN (
    SELECT grp, MAX(data) AS data
    FROM yourtable
    GROUP BY grp
) T2
WHERE T1.grp = T2.grp AND T1.data = T2.data

Решение PostgreSQL:

SELECT DISTINCT ON (grp) id
FROM yourtable
ORDER BY grp, data DESC;

PS: я изменил имя столбца с group на grp, потому что group - зарезервированное слово,Если вы действительно хотите использовать group, вам придется его процитировать.

0 голосов
/ 12 января 2011
SELECT Id
FROM Table t1 JOIN (Select Group, Max(Data) Data from Table 
                   group by group) t2
WHERE t1.Group = t2.Group
  AND t1.Data = t2.Data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...