Cette question a été inspirée par celle-ci [fermée] et est pratiquement identique à celle- ci mais en utilisant différents SGBDR (PostgreSQL vs. MySQL).
Supposons que j'ai une liste de tumeurs (ces données sont simulées à partir de données réelles):
CREATE table illness (nature_of_illness VARCHAR(25), created_at DATETIME);
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Lung', '2018-01-03 17:50:32');
INSERT INTO illness VALUES ('Lung', '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung', '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung', '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Cervix', '2018-02-03 17:50:32');
-- 2017, with 1 Cervix and Lung each for the month of Jan - tie!
INSERT INTO illness VALUES ('Cervix', '2017-01-03 15:45:40');
INSERT INTO illness VALUES ('Lung', '2017-01-03 17:50:32');
INSERT INTO illness VALUES ('Lung', '2017-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung', '2017-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung', '2017-02-03 17:50:32');
INSERT INTO illness VALUES ('Cervix', '2017-02-03 17:50:32');
Vous voulez savoir quelle tumeur particulière était la plus courante au cours d'un mois donné - jusqu'ici tout va bien!
Maintenant, vous remarquerez que pour le mois 1 de 2017, il y a une égalité - il n'est donc pas logique d'en choisir une au hasard et de donner cela comme réponse - donc des égalités doivent être incluses - cela rend le problème beaucoup plus difficile.
La bonne réponse est:
Year Month Tumour count Type
2017 1 1 Cervix -- note tie
2017 1 1 Lung -- " "
2017 2 3 Lung
2018 1 5 Cervix
2018 2 3 Lung
Un autre avantage serait que le nom du mois apparaisse sous forme de texte plutôt que d'entier.
J'ai une solution mais elle est assez complexe - j'aimerais savoir si ma solution est optimale ou non. Le violon MySQL est là !
Réponses:
Ma tentative pour résoudre ce problème est la suivante. J'apprécierais tout conseil sur la façon dont cette requête pourrait être améliorée:
Et cela donne le résultat correct, comme on peut le voir ici au violon !
la source
À l'aide de MySQL-8.0 et des CTE, nous créons d'abord
tmp
le groupe de comptage agrégé par année / mois /nature_of_illness
,RANK()
attribue des valeurs identiques àc
de la même valeur afin que le max en double soit pris en compte:la source