Esta questão foi inspirado por este um [fechada] e é virtualmente idêntica a esta uma mas utilizando diferentes RDBMS de (PostgreSQL vs. MySQL).
Suponha que eu tenha uma lista de tumores (esses dados são simulados a partir de dados reais):
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');
Você quer descobrir qual tumor em particular foi o mais comum em um determinado mês - até agora tudo bem!
Agora, você notará que, no primeiro mês de 2017, há um empate - portanto, não faz sentido escolher um aleatoriamente e dar isso como resposta - para que os empates tenham que ser incluídos - isso torna o problema muito mais desafiador.
A resposta correta é:
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
Um bônus adicional seria fazer com que o nome do mês aparecesse como texto em vez de um número inteiro.
Eu tenho uma solução, mas é bastante complexa - eu gostaria de saber se minha solução é ótima ou não. O violino do MySQL está aqui !
Respostas:
Minha tentativa de resolver isso é a seguinte. Eu gostaria de receber algum conselho sobre como essa consulta poderia ser melhorada:
E dá o resultado correto, como pode ser visto no violino aqui !
fonte
Usando o MySQL-8.0 e CTEs, primeiro criamos
tmp
como o agrupamento de contagem agregada por ano / mês /nature_of_illness
,RANK()
atribui valores idênticos aoc
mesmo valor para que o máximo duplicado seja contabilizado:fonte