Mysql
 sql >> Base de données >  >> RDS >> Mysql

dans les tris de groupe dans mysql

Fonctions fenêtre absentes, vous pouvez commander tbl et utilisez des variables utilisateur pour calculer vous-même le rang sur vos partitions (valeurs "date") :

SELECT "date",                                                -- D) Desired columns
       id,
       value,
       rank
  FROM (SELECT "date",                                        -- C) Rank by date
               id,
               value,
               CASE COALESCE(@partition, "date")
                 WHEN "date" THEN @rank := @rank + 1
                 ELSE             @rank := 1
               END AS rank,
               @partition := "date" AS dummy
          FROM (SELECT @rank := 0 AS rank,                    -- A) User var init
                       @partition := NULL AS partition) dummy
               STRAIGHT_JOIN
               (  SELECT "date",                              -- B) Ordering query
                         id,
                         value
                    FROM tbl
                ORDER BY date, value) tbl_ordered;

Mettre à jour

Alors, que fait cette requête ?

Nous utilisons des variables utilisateur pour "faire une boucle" dans un ensemble de résultats triés, en incrémentant ou en réinitialisant un compteur (@rank ) en fonction du segment contigu du jeu de résultats (suivi dans @partition ) nous sommes.

Dans la requête A nous initialisons deux variables utilisateur. Dans la requête B nous obtenons les enregistrements de votre table dans l'ordre dont nous avons besoin :d'abord par date, puis par valeur. A et B créer ensemble une table dérivée, tbl_ordered , cela ressemble à ceci :

rank | partition | "date" |  id  | value 
---- + --------- + ------ + ---- + -----
  0  |   NULL    |   d1   |  id2 |    1
  0  |   NULL    |   d1   |  id1 |    2
  0  |   NULL    |   d2   |  id1 |   10
  0  |   NULL    |   d2   |  id2 |   11

Rappelez-vous, nous ne nous soucions pas vraiment des colonnes dummy.rank et dummy.partition - ce sont juste des accidents de la façon dont nous initialisons les variables @rank et @partition .

Dans la requête C nous parcourons les enregistrements de la table dérivée. Ce que nous faisons est plus ou moins ce que fait le pseudo-code suivant :

rank      = 0
partition = nil

foreach row in fetch_rows(sorted_query):
  (date, id, value) = row

  if partition is nil or partition == date:
    rank += 1
  else:
    rank = 1

  partition = date

  stdout.write(date, id, value, rank, partition)

Enfin, interrogez D projette toutes les colonnes de C sauf pour la colonne contenant @partition (que nous avons nommé dummy et n'ont pas besoin d'être affichés).