2014-10-10 2 views
-1

мне нужно элементы, имеющие максимальную value за ITEM в следующей таблице:Как получить максимальные значения в одном столбце для каждого значения другого столбца?

Входной таблице:

value | ITEM 
1  | A 
2  | B 
3  | C 
4  | A 
5  | B 
6  | C 
7  | E 

желаемого результата:

value | ITEM 
4  | A 
5  | B 
6  | C 
7  | E 
+0

Является '7' или' é' ожидаемое значение? Или оба? –

+0

google aggrigate [functions] (http://msdn.microsoft.com/en-us/library/ms173454.aspx) –

ответ

0
SELECT Item, Value, MaxValue = (SELECT MAX(t2.VALUE) 
           FROM TableName t2 
           WHERE t.Item= t2.Item) 
FROM TableName t 

SQL-Fiddle

или, если вы не хотите, чтобы все записи, используйте Group By:

SELECT Item, MaxValue = MAX(VALUE) 
FROM TableName t 
GROUP BY Item 

SQL-Fiddle

+0

первая часть вашего ответа медленная и должна быть решена с помощью синтаксиса: SELECT ITEM, Value, max (value) over (partition by item) maxvalue FROM tablename –

+1

@ t-clausen.dk: imho, который является слишком общим. При правильных индексах подзапрос может даже выполнять быстрее, чем 'Over'-clause. Я тестировал его только на средней таблице (20-миллиметровые строки), где сразу появился суб-запрос, тогда как «max (value) over (partition by item)» заняло несколько секунд из-за полу оптимального плана выполнения. Тем не менее, я использую SQL-Server 2005, возможно, теперь он работает лучше. –

+0

Тим - я могу подтвердить ваше требование в sqlserver 2008. Я потерял дар речи. Версия подзаголовка была в 3 раза быстрее, чем переопределение в моем тесте. Я тестировал на 1 мил строк –

0

Попробуйте так:

select MAX(value) as MAXvalue , ITEM from tbl_name 
group By ITEM 
0

Поскольку вы хотите максимально Somethings за ITEM, вам необходимо сначала GROUP BY ITEM. То, что это делает концептуально является группировать строк таблицы в группы, где каждая группа имеет такое же значение для ITEM:

  • 1 | A
    4 | A

  • 2 | B
    5 | B

  • 3 | C
    6 | C

  • 7 | E

Затем для каждой группы, вы хотите максимум value (в выходном столбце с именем value), а также ITEM сам, так что вы SELECT MAX(value) AS value, ITEM.

Наконец, ваш запрос выглядит следующим образом:

SELECT MAX(value) AS value, ITEM 
FROM … 
GROUP BY ITEM 
+0

Но мне не нужны значения (A-1, B-2 ....) Только самый высокий раз, когда он нужен. –

+0

Вы попробовали? 'GROUP BY' и' MAX (value) 'позаботятся об этом (то есть строки с не максимальным' значением' будут отсутствовать в результате). – stakx

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