Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL плътен ранг за всяка група/раздел

Можете да създадете (временен) MyISAM таблица с AUTO_INCREMENT rank колона в съставен ПЪРВИЧЕН КЛЮЧ. По този начин rank ще има една последователност на ID когато попълните таблицата с различен (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 или MariaDB 10.2 би било:

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

Демо



  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 таблица?

  2. Как да инсталирате MySQL на Windows

  3. Качете изображение директно през командния ред на mySQL

  4. Изтриване на свързани записи в MySQL

  5. MYSQL sum() за отделни редове