我有以下查询
context = d3.select("#context").transition();
context.select(".line2")
正在制作
select year, name, count(*) as c from product
group by year, name order by year, c desc limit 10
等
年专栏有2007年至2017年。
如何找到每年前3名+----+------------+------+
|year|name |c |
+----+------------+------+
|2007| A| 913|
|2007| J| 814|
|2007| M| 565|
|2007| C| 453|
|2007| S| 414|
?
我一直在尝试使用rank和dense_rank,但没有运气。
我觉得我很近,但就在那里。
数据库并不重要,我在这里寻找概念而不是db特定。我可以根据需要翻译它。
提前致谢
答案 0 :(得分:1)
MySQL中最简单的方法是有点黑客攻击。假设名称没有逗号:
select year, substring_index(group_concat(name order by cnt desc), ',', 3) as names
from (select year, name, count(*) as cnt
from product
group by year, name
) t
group by year
order by year;
注意:这也有基于group_concat()
中间值的默认大小的内部限制。它应该在合理的数据集上运行良好(每年有数十个但不是数千个名称)。
通过“first_letter”,我认为您的意思是name
或left(name, 1)
。