Ta kwestia była inspirowana przez ten [zamknięte] i jest praktycznie identyczny do tego jednego , ale przy użyciu różnych RDBMS'S (PostgreSQL vs MySQL).
Załóżmy, że mam listę guzów (dane te są symulowane na podstawie rzeczywistych danych):
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');
Chcesz dowiedzieć się, który konkretny guz był najczęstszy w danym miesiącu - jak dotąd!
Zauważysz teraz, że w 1. miesiącu 2017 r. Jest remis - więc nie ma sensu losowo wybierać jednego i dawać go jako odpowiedź - więc należy uwzględnić remisy - to sprawia, że problem jest znacznie trudniejszy.
Poprawna odpowiedź to:
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
Dodatkową korzyścią byłoby wyświetlanie nazwy miesiąca jako tekstu zamiast liczby całkowitej.
Mam rozwiązanie, ale jest dość złożone - chciałbym wiedzieć, czy moje rozwiązanie jest optymalne, czy nie. Skrzypce MySQL jest tutaj !
Odpowiedzi:
Moja próba rozwiązania tego jest następująca. Byłbym wdzięczny za wszelkie porady dotyczące ulepszenia tego zapytania:
I daje poprawny wynik, jak widać tutaj na skrzypcach !
źródło
Korzystając z MySQL-8.0 i CTE, najpierw tworzymy
tmp
jako grupowanie agregatów według roku / miesiąca /nature_of_illness
,RANK()
przypisujemy identyczne wartości doc
tej samej wartości, tak aby uwzględnić maksimum duplikatu:źródło