此查询使用排名功能获取每个组中的顶级项目。
我想将内部选择的数量减少到两个而不是三个。我尝试在最里面的查询中使用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
答案 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;