Pertanyaan ini diinspirasi oleh yang satu ini [ditutup] dan hampir identik dengan yang satu ini tetapi menggunakan RDBMS yang berbeda (PostgreSQL vs MySQL).
Misalkan saya memiliki daftar tumor (data ini disimulasikan dari data nyata):
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');
Anda ingin mengetahui tumor mana yang paling umum pada bulan tertentu - sejauh ini sangat baik!
Sekarang, Anda akan melihat bahwa untuk bulan 1 tahun 2017, ada dasi - jadi tidak masuk akal untuk memilih secara acak dan memberikannya sebagai jawaban - jadi ikatan harus disertakan - ini membuat masalah jauh lebih menantang.
Jawaban yang benar adalah:
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
Bonus lebih lanjut adalah memiliki nama bulan muncul sebagai teks daripada bilangan bulat.
Saya punya solusi tetapi cukup rumit - Saya ingin tahu apakah solusi saya optimal atau tidak. Biola MySQL ada di sini !
Jawaban:
Upaya saya untuk menyelesaikan ini adalah sebagai berikut. Saya akan sangat menghargai saran tentang bagaimana permintaan ini dapat ditingkatkan:
Dan itu memang memberikan hasil yang benar, seperti yang bisa dilihat di biola di sini !
sumber
Menggunakan MySQL-8.0 dan CTE pertama-tama kita buat
tmp
sebagai pengelompokan jumlah agregat berdasarkan tahun / bulan /nature_of_illness
,RANK()
memberikan nilai yang identik dengan nilaic
yang sama sehingga duplikat maks diperhitungkan:sumber