夏休み直前に後輩Hシー氏から振られた話題を記録しておく。今回のデータは、SQLでデータベーステーブルの縦・横変換で使っていたデータを流用します。行)これらのクエリがベースとなります。商品毎のランキング商品毎の結果にランキングを付与してみます。行)RANK()関数はウインドウ関数で、指定された範囲内(ウインドウ内)での現在行の位置に対応した値を返します。BY句による範囲指定がないので、テーブル内のレコード全体が対象になります。BY句でソートをさせて決めています。結果をソートさせています。DESC”の記述も行った方が良いです。売上年別でランキング次に売上年別の結果にランキングを付与してみます。行)集計単位を商品から売上年に切り替えただけで、結果は予想通りですね。DESC”の記述も行った方が良いです。売上年別の商品のランキング売上年別の商品売上ランキングを出してみます。BY句で、RANK()関数が算出する行位置の範囲を指定します。指定するので、売上年毎にSUM(売上)でソートが行われ、RANK()関数は売上年が変わると改めて行位置を1から計算して返すことになります。TOP3を出すにはどうするのさ?もうお分かりの通り、RANK()関数の結果でフィルターすれば良いのです。売上年別の商品売上ランキングTOP3なら以下のようなクエリがあります。売上合計が同じ値になる商品だって当然出てきます。した場合、RANK()関数を使うと意図した出力にならないかもしれません。データに漏れがあったことが判明し、‟すいか”、‟もも”の情報を追加したとしましょう。ついでなので、DENSE_RANK()関数、ROW_NUMBER()関数、についても確認してみます。kouhai=>すいか、まんごー、もも、の売上合計が同一値のため同順タイになり、RANK()関数では同順タイの部分の幅を飛ばしてナンバリングするので、さくらんぼうが5位になってしまいました。DENSE_RANK()関数を使った場合は同順タイがあっても飛ばさないでナンバリングするため、さくらんぼうは3位となります。ROW_NUMBER()関数はレコードの並びにそのまま連番を振るので、さくらんぼうは5位になります。商品名によるソートが行われないので、ROW_NUMBER()関数の時は、すいか、まんごー、もも、の順位が変わる可能性が出てきます。いった結果を望むのかで関数をチョイスする必要があります。追記:ソート順が変わる話ROW_NUMBER()の説明で「すいか、まんごー、もも、の順位が変わる可能性」のところがよう分からん、と言われたので。先のSQL実行結果の並びをもう一度確認します。kouhai=>次に、売上年でのフィルターを外して実行します。並びに差異があることがわかります。←これは表示順を明示していないので、実行するSQLによって表示順は変わる、という例です。表示順は変わらないかもしれませんし、暗黙でソートがかかっているデータベース製品もあるかもしれません。