sql >> データベース >  >> RDS >> Database

SQLでパーティション内の行をランク付けする方法

    問題:

    結果セットで、レコードを分割し、各パーティション内の行をランク付けし、パーティション内の行のランクを表示する別の列を追加します。

    例:

    私たちのデータベースには、次の列にデータがあるmagazineという名前のテーブルがあります:id (主キー)、namecategory 、および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()を使用すると、結果セットがカテゴリごとに雑誌の個別のグループに分割されます。 。各グループで、行は価格で並べ替えられました その後、そのグループ内でランク付けされます。


    1. SQL Server(T-SQL)のデータベースメールのキューにあるメールアイテムの数を確認する

    2. 'mysqldump'を使用してすべてのテーブルをCSV形式でダンプします

    3. アイドル状態のPostgreSQL接続のタイムアウトはありますか?

    4. from句の列からテーブル名をフェッチします