2011-12-27 89 views
-1

給定一個表:的Oracle SQL查詢援助

ID NUMBER 
OBJECTID NUMBER 
CATEGORYID NUMBER 
SCORE NUMBER 
SCOREDATE DATE 

是否可以有效地檢索在每個不同類別的最後得分(基於SCOREDATE),用於一個查詢給定的對象?

+1

是您的表索引?你到目前爲止是否有一個非高效的查詢? – 2011-12-27 17:34:36

+0

我的表未編入索引。這可能是一種可能性,但我現在還不確定。我可以想象我可以用子查詢抽出一些東西,但它似乎並不比在我的應用程序邏輯中用許多查詢檢索數據更有效。 – smp7d 2011-12-27 17:37:41

+0

這個問題爲什麼被低估?我不允許詢問建議的查詢技巧嗎? – smp7d 2012-01-18 17:00:13

回答

7

嘗試:

select v.* from (
select category_id, 
     score, 
     scoredate, 
     row_number() over (partition by category_id order by scoredate desc) rn 
from MyTable) v 
where rn=1 
3

你想要的東西落入[greatest-n-per-group]標籤。實現結果的一種方式:

SELECT 
    t.CategoryId 
    , t.Score 
FROM 
    (SELECT 
      CategoryId 
     , MAX(ScoreDate) AS LastScoreDate 
     FROM 
      TableX 
     WHERE 
      ObjectId = @ObjectId 
     GROUP BY 
      CategoryId 
    ) AS grp 
    JOIN 
     TableX AS t 
    ON grp.Category = t.CategoryId 
    AND grp.LastScoreDate = t.ScoreDate 
WHERE 
    t.ObjectId = @ObjectId