2012-03-07 7 views
-1

誰かが以下の質問を説明してもらえますか? IDはPKではなく、同じIDに対して複数の行が存在する可能性があります。このクエリは最新の行を取得します。PARTITIONでSQLを説明してください

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

答えて

3

このクエリは、ID 123の最新のdate_of_scoreのスコアを選択します。 ここでは、1つの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

3

ROW_NUMBER()この場合には、行ごとに異なる番号を返す関数分析関数です。 PARTITION句は行番号が生成されるウィンドウを制御し、ORDER BYはそのパーティション内の行のソートを決定します。

このように、内側のクエリでは、各行の数値が生成され、指定されたIDの各レコードの開始の番号がリセットされ、逆の日付順にソートされます。これは、各IDの最新レコードに行番号が1であることを意味します。外部クエリfilteresは、その関数のエイリアスのRNで、すべてのIDの最新レコードのみを含む結果セットを生成します。

解析関数は、投影のすべての列で分割せずに使用できる点で集計関数(GROUP BY)と異なります。これにより、他の列を返すときにクエリで便利になります。

Oracleのマニュアルは、包括的で、オンラインで無料です。あなたはそれをナビゲートすることを学ぶべきです。 Find out more about analytic functions here

関連する問題