Esta pregunta se inspiró en éste [cerrada] y es virtualmente idéntica a ésta uno pero utilizando diferentes RDBMS de (PostgreSQL vs MySQL).
Supongamos que tengo una lista de tumores (estos datos se simulan a partir de datos reales):
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');
Desea averiguar qué tumor en particular fue más común en un mes determinado, ¡hasta ahora tan bueno!
Ahora, notará que para el mes 1 de 2017, hay un empate, por lo que no tiene ningún sentido elegir uno al azar y darlo como respuesta, por lo que los lazos deben incluirse, esto hace que el problema sea mucho más desafiante.
La respuesta correcta es:
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
Una ventaja adicional sería que el nombre del mes aparezca como texto en lugar de como un entero.
Tengo una solución pero es bastante compleja: me gustaría saber si mi solución es óptima o no. ¡El violín de MySQL está aquí !
Respuestas:
Mi intento de resolver esto es el siguiente. Agradecería cualquier consejo sobre cómo podría mejorarse esta consulta:
¡Y da el resultado correcto, como se puede ver en el violín aquí !
fuente
Usando MySQL-8.0 y CTEs, primero creamos
tmp
como la agrupación de conteo agregado por año / mes /nature_of_illness
,RANK()
asigna valores idénticos alc
mismo valor para que se tenga en cuenta el máximo duplicado:fuente