sql >> Databáze >  >> RDS >> Mysql

Husté hodnocení MySQL pro každou skupinu/oddíl

Můžete vytvořit (dočasný) MyISAM tabulka s AUTO_INCREMENT rank sloupec ve složeném PRIMÁRNÍM KLÍČI. Tímto způsobem rank bude mít jednu sekvenci na ID když tabulku vyplníte odlišným (id, item_code) kombinace. Potom můžete tuto tabulku spojit s původními daty.

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>

Ukázka

Pokud to chcete v jediném dotazu, můžete zkusit tento:

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

Ukázka

Uvědomte si, že pořadí vyhodnocení operací v příkazu SQL není definováno. Když tedy čtete a zapisujete uživatelskou proměnnou ve stejném příkazu, spoléháte na detaily implementace.

V MySQL 8 nebo MariaDB 10.2 bylo by to:

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

Ukázka



  1. Převeďte hodnotu sloupce odděleného čárkami na řádky

  2. order by rand() má problémy s velkými příspěvky

  3. Aktualizujte sloupec na základě odpovídajících hodnot v jiné tabulce v mysql

  4. YEAR() Příklady – MySQL