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).