2010-02-19 57 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;