Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Peringkat padat MySQL untuk setiap grup/partisi

Anda dapat membuat (sementara) MyISAM tabel dengan AUTO_INCREMENT rank kolom dalam KUNCI UTAMA komposit. Dengan cara ini rank akan memiliki satu urutan per ID ketika Anda mengisi tabel dengan (id, item_code) yang berbeda kombinasi. Anda kemudian dapat menggabungkan tabel itu dengan data asli.

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>

Demo

Jika Anda menginginkannya dalam satu kueri, Anda dapat mencoba yang ini:

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

Demo

Ketahuilah, bahwa urutan evaluasi operasi dalam pernyataan SQL tidak ditentukan. Jadi, ketika Anda membaca dan menulis variabel pengguna dalam pernyataan yang sama, Anda menyampaikan detail implementasi.

Di MySQL 8 atau MariaDB 10.2 itu akan menjadi:

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

Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - apa fungsi skip-locking di my.cnf?

  2. Bagaimana cara memotong tabel menggunakan Doctrine 2?

  3. subtotal dan total untuk string

  4. Pengecualian Keamanan menggunakan MySQL dan Entity Framework di godaddy

  5. Kondisi INNER JOIN dalam klausa WHERE atau klausa ON?