这个问题的灵感来自这个[关闭]并且实际上与这个问题相同但使用不同的RDBMS(PostgreSQL vs. MySQL)。
假设我有一个肿瘤列表(这个数据是根据真实数据模拟的):
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');
您想找出给定月份中哪种特定肿瘤最常见 - 到目前为止一切顺利!
现在,您会注意到,对于 2017 年的第 1 个月,有一个平局 - 因此随机选择一个并给出它作为答案是没有任何意义的 - 所以必须包括平局 - 这使得问题更具挑战性。
正确答案是:
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
另一个好处是让月份名称显示为文本而不是整数。
我有一个解决方案,但它非常复杂 - 我想知道我的解决方案是否最优。MySQL 小提琴在这里!
我尝试解决这个问题如下。对于如何改进此查询的任何建议,我将不胜感激:
它确实给出了正确的结果,正如在这里的小提琴中所见!
使用 MySQL-8.0 和 CTE,我们首先创建
tmp
按年/月/ 分组的聚合计数nature_of_illness
,RANK()
将相同的值分配给相同的值,c
以便考虑重复的最大值: