2009-06-09 90 views
3

這是我擁有的數據樣本。高級分組,不使用子查詢

-ID-  -Rank-  -Type-  -Status- -Amount- 
1142474  2  Under Offer Approved 23 
1148492  1  Present  Current  56 
1148492  2  Under Offer Approved 3 
2273605  1  Present  Current  24 

在ID相同的情況下,我只想要排名最高的記錄。所以查詢的最終結果。

-ID-  -Rank-  -Type-  -Status- -Amount- 
1142474  2  Under Offer Approved 23 
1148492  1  Present  Current  56 
2273605  1  Present  Current  24 

我們得到原始數據集是一個昂貴的操作,所以由ID做,然後分鐘軍銜然後加入回再次到數據集上。因此查詢需要以另一種方式完成其工作。

乾杯 安東尼

一般可用

回答

1
select t1.id 
     , t1.rank 
     , t1.type 
     , t1.status 
     , t1.amount 

from my_table t1 

     left outer join my_table as t2 
     on t1.id = t2.id 
    and 
     t2.rank < t1.rank 

where t2.id is null 
+0

在這種情況下t2是什麼? – 2009-06-09 06:15:41

+0

@Anthony:t2的連接也被稱爲自連接。這是同一張表的另一個副本。它工作的原因是我們在謂詞(連接條件和WHERE子句)中指定我們想要排除每個id的最高排序項目以外的所有項目。 – bernie 2009-06-09 06:28:06

+0

@adam:問題是,從my_table中獲取數據非常昂貴(即在2到6秒之間),因此我想避免再次加入到表格中... – 2009-06-09 06:52:02

0

選項包括:

  • 存放在臨時表中所示的數據,然後查詢臨時表。
  • 使用WITH子句來定義複雜查詢,然後讓DBMS整理查詢。

WITH子句有效地允許您給一個子查詢命名;如果可能的話,優化器將避免重新評估它。 TEMP表格解決方案可能是最簡單的。這將做ID和MIN(等級)的GROUP BY,並加入回來。

2
SELECT * FROM TheTable 
WHERE 1 = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Rank DESC) 
6

這將工作:

with temp as (
select *, row_number() over (partition by id order by rank) as rownum 
from table_name 
) 
select * from temp where rownum = 1 

會給每個ID只能有一個記錄,其中級爲最低數量

0

爲什麼找數據集那麼貴,我看沒什麼可怕的這裏複雜。你有你需要的索引,是使用它們的查詢嗎?統計數據是否過時?