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

各グループ/パーティションのMySQL高密度ランク

    (一時的な) MyISAMを作成できます AUTO_INCREMENTrankを含むテーブル 複合主キーの列。このようにrank IDごとに1つのシーケンスがあります テーブルに個別の(id, item_code)を入力する場合 組み合わせ。その後、そのテーブルを元のデータと結合できます。

    CREATE TEMPORARY TABLE tmp_rank(
      id INT,
      item_code varchar(50),
      rank INT AUTO_INCREMENT,
      PRIMARY KEY (id, rank)
    ) engine=MyISAM
      SELECT DISTINCT NULL as rank, id, item_code
      FROM test t
      -- WHERE <several filters>
      ORDER BY id, item_code
    ;
    
    SELECT t.*, x.rank
    FROM tmp_rank x
    JOIN test t USING(id, item_code)
    -- WHERE <several filters>
    

    デモ

    単一のクエリでそれが必要な場合は、これを試すことができます:

    SELECT id, item_code,
        CASE 
          WHEN id = @curId AND item_code = @curCode
            THEN @curRank
          WHEN id <> @curId THEN @curRank := 1
          ELSE @curRank := @curRank + 1
        END  AS rank,
        @curId := id,
        @curCode := item_code
    FROM test t
    CROSS JOIN (SELECT
        @curRank := 0,
        cast(@curCode := null as signed),
        cast(@curId   := NULL as char)
    ) r
    #WHERE <several filters>
    ORDER BY id, item_code
    

    デモ

    SQLステートメントの操作の評価順序は定義されていないことに注意してください。したがって、同じステートメントでユーザー変数を読み書きするときは、実装の詳細を中継します。

    MySQL 8 またはMariaDB10.2

    SELECT  id, item_code,
        DENSE_RANK() OVER (PARTITION BY id ORDER BY item_code) as `rank`
    FROM test t
    -- WHERE <several filters>
    

    デモ



    1. シングルトンPDOモデル-階層

    2. .NETを介したPL/SQLコレクション型パラメータを使用したOracleプロシージャの呼び出し

    3. SQL count(*)のパフォーマンス

    4. テーブルまたは列へのすべての外部キーを表示するにはどうすればよいですか?