2013-09-30 3 views
0

У меня есть таблица с наиболее распространенными цветами в изображениях. Это выглядит примерно так:Значения в том же ряду группового максимума

file | color | count 
--------------------- 
1 | ffefad | 166 
1 | 443834 | 84 
2 | 74758a | 3874 
2 | abcdef | 228 
2 | 876543 | 498 
3 | 543432 | 3382 
3 | abcdef | 483 

Я пытаюсь получить наиболее общий цвет для каждого изображения. Поэтому я хочу, чтобы мой результат будет:

file | color | count 
--------------------- 
1 | ffefad | 166 
2 | 74758a | 3874 
3 | 543432 | 3382 

Так что моя проблема, кажется, что мне нужно GROUP BY в file колонке, но MAX() для count колонки. Но просто

SELECT h.file, h.color, MAX(h.count) FROM histogram GROUP BY h.file 

не работает, потому что он неопределен, поэтому результат цвета не будет соответствовать строке из результата подсчета.

SELECT h.file, h.color, MAX(h.count) FROM histogram GROUP BY h.file, h.color 

исправляет определенность, но теперь каждая строка является «уникальной», и все строки возвращаются.

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

Возможно, мне нужна более простая схема? Это «мой» стол, поэтому я могу изменить это, если нужно.

+0

Вы должны подождать, прежде чем принимать ответ; @Twelfth работает в 2 - 3 раза быстрее, чем AgRizzo. См. Http://sqlfiddle.com/#!2/82203/8 –

ответ

1
SELECT tbl.file, tbl.color, tbl.count 
FROM tbl 
LEFT JOIN tbl as lesser 
ON lesser.file = tbl.file 
AND tbl.count < lesser.count 
WHERE lesser.file IS NULL 
order by tbl.file 
+0

Я не понимаю, почему это работает, поскольку 'file' не является отдельным полем, но это так. Благодарю. Я думаю, что я собираюсь решить это на практике, однако, просто добавив столбец «rank» в таблицу, которая содержит относительный ранг цвета для каждого файла, поэтому я могу просто сделать SELECT * WHERE rank = 1 '. Это также облегчит получение наиболее распространенных цветов 2, 3, N для каждого изображения, что также может потребоваться в будущем. –

1
select file , max(count) 
FROM histogram 
GROUP BY h.file 

Это даст максимум (COUNT) на файл. Поверните его в подзапрос и внутреннее соединение, чтобы он работал как фильтр.

select h.file, h.colour, h.count 
from histogram inner join 
(select file , max(count) as maxcount 
FROM histogram 
GROUP BY h.file) a 
on a.file = h.file and a.maxcount = h.count 

Это ответит на 2 строки, если имеется более одного цвета с одинаковым максимальным количеством.

Смежные вопросы