1

此查询使用排名函数获取每个组中的顶部项目。

我想将内部选择的数量减少到两个而不是三个。我尝试在最里面的查询中使用 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

4

2 回答 2

3

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

于 2010-02-19T02:40:36.807 回答
0

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

这是语法:

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

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

运行 CTE 的语句是:

SELECT <column_list>
FROM expression_name;
于 2014-05-15T20:01:04.127 回答