2016-07-11 1 views
1
ID| tag | version 
-----+-----+----- 
1| A | 10 
2| A | 20 
3| B | 99 
3| C | 30 
3| F | 40 

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

1 A 10 
2 A 20 
3 B 99 

Как я могу получить максимальную версию каждого ID и соответствующий тег для этой версии? Скорость важна (у меня около 28 м строк), поэтому вложенный Select не будет делать этого. Также простая группа по ID с max (версия) не работает, потому что мне также нужен соответствующий тег, где версия макс.

+2

Этот вопрос задают и ответил бесконечно. Некоторые из ответов верны. – Strawberry

+0

Я попробовал группу по ID с max (version), но это не работает, потому что мне также нужен тег – Nickpick

+0

Посмотрите, там есть правильный номер -----> – Strawberry

ответ

2

Использование ROW_NUMBER():

SELECT s.id,s.tag,s.version FROM (
    SELECT t.*, 
      ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY t.version DESC) as rnk 
    FROM YourTable t) s 
WHERE s.rnk = 1 
+0

Вложенный выбор будет очень медленным Я предполагаю, что если у меня есть 28-миллиметровые строки – Nickpick

+0

Вложенный выбор не повредит производительность, его просто так вы сможете обратиться к столбцу 'rnk', который оценивается во внутреннем запросе. Запустите запрос, а затем решите о performace @nickpick – sagi

+0

. По какой-то причине вывод возвращает гораздо меньше результатов, чем ожидалось. – Nickpick

2

Попробуйте

select id, max(tag) keep(dense_rank first order by VERSION desc) as tag, max(version) as version 
from t group by id 
+0

почему max (tag)? тег не является числом. также «Ключевое слово FROM не найдено, где ожидалось» – Nickpick

+0

Это не имеет значения. Oracle ищет значения в первом порядке по VERSION desc. Он находит отсортированную версию VERSION по desc (или max, это то же самое) и возвращает первую основанную строку. Затем Oracle получает Max (тег) первой возвращающейся строки и потому что это единственная строка, тогда max работает правильно. –

+0

@Nickpick «От ключевого слова FROM не найдено, где ожидалось» - «от t», где t - ваша таблица. –