2012-03-07 50 views
-1

的SQL可能有人請解釋一下下面的查詢? ID不是PK,並且對於相同的ID可以有多行。該查詢獲取最新的行。請解釋與PARTITION

SELECT ID, SCORE, DATE_OF_SCORE FROM 
(
SELECT ID, SCORE, DATE_OF_SCORE, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE_OF_SCORE DESC) RN 
FROM PERSON_SCORE_DETAILS 
WHERE ID = 123 
) 
WHERE RN = 1; 
+0

@downvoter請解釋。 – Vaandu 2012-03-07 10:05:45

回答

3

此查詢選擇id 123的最近date_of_score的得分。 由於您只選擇一個id,因此這裏的partition by子句是多餘的。

而這種類型的查詢更好地使用聚合,這樣的處理:

select id 
    , max(score) keep (dense_rank last order by date_of_score) score 
    , max(date_of_score) date_of_score 
    from person_score_details 
where id = 123 
group by id 

或者更簡單:

select 123 
    , max(score) keep (dense_rank last order by date_of_score) score 
    , max(date_of_score) date_of_score 
    from person_score_details 
where id = 123 

問候,
羅布。

+0

+1我沒有發現內部查詢只選擇了一個ID的記錄。 – APC 2012-03-07 10:06:20

3

ROW_NUMBER()是一個解析函數,在這種情況下返回的每一行不同的數的函數。 PARTITION子句控制生成行號的窗口,並且ORDER BY確定該分區內的行的排序。

因此,當你觀察到內部查詢產生許多對於每一行,復位爲對於給定的ID的記錄每次運行的開始,這個數字和反向日期順序對它們進行排序。這意味着對每個ID的最新記錄具有1對功能,RN的別名外部查詢filteres行號,以產生一個結果集包括僅針對所有ID的最新記錄。

分析函數從集合函數在(即GROUP BY),我們可以使用它們,而不必通過在投影中的所有列進行分區不同。當我們想返回其他列時,這使它們在查詢中很有用。

Oracle文檔是全面的,在線和自由。你應該學會導航它。 Find out more about analytic functions here