2015-04-07 1 views
2

У меня есть следующая таблица players с:Получение эту группу и не более запросов на работу

ID;color;race;score 
1;"red";"elf";400 
2;"blue";"elf";500 
3;"green";"elf";300 
4;"blue";"elf";200 
5;"red";"elf";700 
6;"red";"troll";100 
7;"blue";"troll";400 
8;"green";"troll";500 
9;"red";"troll";400 
10;"yellow";"troll";1000 
11;"red";"nord";900 
12;"green";"nord";100 
13;"yellow";"nord";500 
14;"blue";"nord";7000 

Я хочу за гонку, максимальное количество баллов и цвет и ID этого игрока. Как это

elf 700 red 5 
nord 7000 blue 14 
troll 1000 yellow 10 

первых два колонка я могу получить с:

select category,max(score) 
from players 
group by category; 

Но я не могу добавить цвет и идентификатор этого игрока. Как мне это сделать?

+0

возможно дубликат [Как выбрать идентификатор с максимальной датой группы по категориям в PostgreSQL ?] (http://stackoverflow.com/questions/16914098/how-to-select-id-with-max -date-group-by-category-in-postgresql) –

+0

Мы не знаем имена ваших столбцов, но почему бы не работать только следующее: 'select category, max (score), max (id), max (color) от игроков группа по категориям; ' –

ответ

1

Вы можете использовать RANK функцию:

WITH cte AS 
(
    SELECT *, RANK() OVER(PARTITION BY race ORDER BY score DESC) AS r 
    FROM players 
) 
SELECT race, score, color, id 
FROM cte 
WHERE r = 1; 

LiveDemo

Выход:

╔═══════╦═══════╦════════╦════╗ 
║ race ║ score ║ color ║ id ║ 
╠═══════╬═══════╬════════╬════╣ 
║ elf ║ 700 ║ red ║ 5 ║ 
║ nord ║ 7000 ║ blue ║ 14 ║ 
║ troll ║ 1000 ║ yellow ║ 10 ║ 
╚═══════╩═══════╩════════╩════╝