使用rank函数优化sql查询

时间:2010-02-19 02:15:30

标签: sql rank

此查询使用排名功能获取每个组中的顶级项目。

我想将内部选择的数量减少到两个而不是三个。我尝试在最里面的查询中使用rank()函数,但无法使其与聚合函数一起使用。然后我不能在'itemrank'上使用where子句而不将其包装在另一个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 个答案:

答案 0 :(得分:3)

在Oracle和Teradata(也许还有其他人)中,您可以使用QUALIFY itemrank = 1来删除外部选择。这不是ANSI标准的一部分。

答案 1 :(得分:0)

您可以在Oracle或SQL Server中使用公用表表达式。

以下是语法:

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

只有在查询定义中提供了所有结果列的不同名称时,列名列表才是可选的。

运行CTE的声明是:

SELECT <column_list>
FROM expression_name;