Оптимизировать SQL-запрос с помощью функции ранга - PullRequest
1 голос
/ 19 февраля 2010

Этот запрос получает верхний элемент в каждой группе, используя функцию ранжирования.

Я хочу уменьшить количество внутренних выборок до двух вместо трех. Я пытался использовать функцию rank () для внутреннего запроса, но не смог заставить ее работать вместе с агрегатной функцией. Тогда я не мог использовать предложение where для itemrank, не добавив его в еще одно выражение select.

Есть идеи?

select *
from (
    select 
        tmp.*,
        rank() over (partition by tmp.slot order by slot, itemcount desc) as itemrank
    from (
        select
            i.name, 
            i.icon,
            ci.slot,
            count(i.itemid) as itemcount
        from items i
        inner join citems ci on ci.itemid = i.itemid
        group by i.name, i.icon, ci.slot    
    ) as tmp
) as popularitems
where itemrank = 1

РЕДАКТИРОВАТЬ: с использованием SQL Server 2008

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010

В Oracle и Teradata (и, возможно, других тоже) вы можете использовать QUALIFY itemrank = 1, чтобы избавиться от внешнего выбора.Это не является частью стандарта ANSI.

0 голосов
/ 16 мая 2014

Вы можете использовать общие табличные выражения в Oracle или в SQL Server.

Вот синтаксис:

WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )

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

Инструкция для запуска CTE:

SELECT <column_list>
FROM expression_name;
...