Расширенная группировка без использования подзапроса - PullRequest
3 голосов
/ 09 июня 2009

Это образец данных, которые у меня есть.

-ID-        -Rank-      -Type-      -Status-    -Amount-
1142474     2       Under Offer Approved    23
1148492     1       Present     Current     56
1148492     2       Under Offer Approved    3
2273605     1       Present     Current     24

Если идентификатор один и тот же, мне нужна только запись с самым высоким рангом. Итак, конечный результат запроса.

-ID-        -Rank-      -Type-      -Status-    -Amount-
1142474     2       Under Offer Approved    23
1148492     1       Present     Current     56
2273605     1       Present     Current     24

Теперь получить исходный набор данных - это дорогостоящая операция, поэтому I не хочет сделать группу по ID , а затем mins ранг и затем снова присоединяется к набору данных. Следовательно, запрос должен выполнять свою работу по-другому.

Приветствие Anthony

Ответы [ 5 ]

6 голосов
/ 09 июня 2009

Это будет работать:

with temp as (
select *, row_number() over (partition by id order by rank) as rownum
from table_name
)
select * from temp where rownum = 1

Даст одну запись на идентификатор, где ранг представляет наименьшее число

2 голосов
/ 09 июня 2009
SELECT * FROM TheTable
WHERE 1 = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Rank DESC)
1 голос
/ 09 июня 2009
select t1.id
       , t1.rank
       , t1.type
       , t1.status
       , t1.amount

from   my_table t1 

       left outer join my_table as t2 
       on t1.id = t2.id 
    and 
       t2.rank < t1.rank 

where  t2.id is null
0 голосов
/ 10 июня 2009

Почему получение данных настолько дорого, я не вижу здесь ничего страшного. У вас есть нужные вам индексы, использует ли их запрос? Статистика устарела?

0 голосов
/ 09 июня 2009

Варианты, доступные в целом, включают:

  • Сохраните показанные данные во временной таблице, а затем запросите временную таблицу.
  • Используйте предложение WITH для определения сложного запроса, затем попросите СУБД разобрать запрос.

Предложение WITH позволяет вам дать имя подзапросу; оптимизатор избежит переоценки, если это вообще возможно. Решение таблицы TEMP, вероятно, будет самым простым. И это сделает GROUP BY ID и MIN (ранга) и присоединится обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...