問題:
結果セットで、レコードを分割し、各パーティション内の行をランク付けし、パーティション内の行のランクを表示する別の列を追加します。
例:
私たちのデータベースには、次の列にデータがあるmagazineという名前のテーブルがあります:id
(主キー)、name
、category
、およびprice
。
id | 名前 | カテゴリ | 価格 |
---|---|---|---|
105 | カントリーリビング | ライフスタイル | 1.70 |
108 | ニュースマガジン | ニュース | 3.35 |
115 | デシベル | 音楽 | 6.50 |
123 | ドラムマガジン | 音楽 | 6.50 |
145 | 日没 | ライフスタイル | 12.00 |
155 | 世界 | ライフスタイル | 9.50 |
158 | キーボード | 音楽 | 8.45 |
カテゴリに従って雑誌をグループ化しましょう 各グループを価格の降順でランク付けします 。各雑誌のランキングの位置、名前、カテゴリ、価格を表示します。
解決策:
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
結果は次のとおりです。
カテゴリ | 名前 | 価格 | price_rank |
---|---|---|---|
ライフスタイル | 日没 | 12.00 | 1 |
ライフスタイル | 世界 | 9.50 | 2 |
ライフスタイル | カントリーリビング | 1.70 | 3 |
音楽 | キーボード | 8.45 | 1 |
音楽 | デシベル | 6.50 | 2 |
音楽 | ドラムマガジン | 6.50 | 2 |
ニュース | ニュースマガジン | 3.35 | 1 |
ディスカッション:
行をパーティション化し、パーティション内の位置でランク付けするには、PARTITION BY句を指定したRANK()関数を使用します。
SQLのRANK()関数を使用すると、結果セット内または各パーティション内にレコードの位置を追加できます。この例では、パーティション内の行をランク付けします。
OVER()句は常にRANK()の後にあります。 OVER()にはORDERBY句が含まれている必要があります。パーティション内でランクを返す場合は、OVER()句内にPARTITIONBY句を配置します。 PARTITION BYの後には、式または列名が続きます。この例では、列category
を使用します (PARTITION BY category
)。
注: パーティションを使用していない場合は、PARTITION BYを省略して、OVER()にORDERBY句を入れるだけです。
PARTITION BYの後に、ORDERBYの後に並べ替え列または式の名前を続けます。この例では、price
列の降順で並べ替えています。 (ORDER BY price DESC
)。 DESCキーワードは、降順の並べ替えを示します。
上記の例では、PARTITION BYでRANK()を使用すると、結果セットがカテゴリごとに雑誌の個別のグループに分割されます。 。各グループで、行は価格で並べ替えられました その後、そのグループ内でランク付けされます。