Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Gęsty ranking MySQL dla każdej grupy/partycji

Możesz utworzyć (tymczasowy) MyISAM tabela z AUTO_INCREMENT rank kolumna w złożonym KLUCZU PODSTAWOWYM. W ten sposób rank będzie miał jedną sekwencję na ID kiedy wypełnisz tabelę odrębnym (id, item_code) kombinacje. Następnie możesz dołączyć do tej tabeli z oryginalnymi danymi.

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

Jeśli chcesz to w jednym zapytaniu, możesz wypróbować to:

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

Należy pamiętać, że kolejność oceny operacji w instrukcji SQL nie jest zdefiniowana. Więc kiedy czytasz i zapisujesz zmienną użytkownika w tej samej instrukcji, polegasz na szczegółach implementacji.

W MySQL 8 lub MariaDB 10.2 byłoby to:

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. Średnia różnica czasu w mysql

  2. PHP - Filtrowanie według wartości pola MySQL

  3. Jaka jest wada korzystania z pola o rozmiarze długiego tekstu MySQL, gdy każdy wpis zmieści się w polu o rozmiarze średniej długości tekstu?

  4. Czy istnieje funkcja MySQL, taka jak kolumna TIMESTAMP programu SQL Server?

  5. hive.HiveImport:FAILED:SemanticException [Błąd 10072]:Baza danych nie istnieje: