2010-02-19 58 views
1

该查询使用排名函数获取每个组中的顶级项目。使用rank函数优化sql查询

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

我不明白的方式来做到这一点......但你为什么要(或需要)砍掉加入? – 2010-02-19 04:24:47

+0

这只是对我来说似乎马虎,我想这样做最好的方法:) – jimj 2010-02-19 04:44:38

回答

3

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

+0

我应该提到,我正在使用SQL Server 2008年。它不出现,资格存在。 – jimj 2010-02-19 02:46:20

+0

坚果,猜测我们将不得不等待SQL 2010,或者其他什么。 – 2010-02-19 04:23:59

0

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

下面是语法:

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

列名的列表是可选的只有在查询定义中提供的所有导致列不同的名称。

运行CTE的语句是:

SELECT <column_list> 
FROM expression_name;