2

発生した日付に基づいて最新のイベントを取得する必要がある Oracle クエリを作成しています。

テスト ケースで正しく動作しているように見えるクエリが 2 つあります。

最初はサブクエリを使用して日付順にイベントを取得し、rownum を介して最初のレコードをプルします。

    SELECT description FROM
    (
     SELECT description FROM tablename
     WHERE ((event_type IN ('A','I','Y')) AND (meeting_date IS NOT NULL) 
     AND id='whatever') 
     ORDER BY meeting_date DESC
    )
    WHERE rownum = 1

2 つ目は、ランクを使用して同じ結果を達成します。

SELECT description FROM
(
SELECT description, RANK() OVER( ORDER BY meeting_date DESC) mtg_rank 
 FROM tablename 
 WHERE ((event_type IN ('A','I','Y'))  AND (meeting_date IS NOT NULL) 
 AND id= 'whatever') 
)
WHERE mtg_rank = 1

私にとって、事前に並べ替えられたrownumは十分に単純であり、それを使用します。rownum がソートの前に機能することを認識しているため、最初にサブセレクトで順序付けを行いました。

しかし、その考えで何かが欠けているかどうかはわかりませんか?

また、この場合のランクが推奨/ベストプラクティスなのか、それともクエリの意図を伝えるのに適しているのか疑問に思っていますか?

4

1 に答える 1

4

同点の場合 (Brian のコメントでよく説明されています) を除いて、両方のクエリが機能し、同じ結果が返されます。

個人的には、分析関数アプローチの方がはるかに適応性が高いため、はるかに好みます。RANKDENSE_RANK、およびROW_NUMBER分析関数を交換することで、同点の処理方法を調整できます。1 つだけではなく 複数の値に対してクエリを実行する場合は、句を追加してPARTITION BY、それぞれの最新の会議を返すこともできます。IDID

于 2012-01-26T18:06:50.910 に答える