MySql 选择每个国家的前 3 个结果

Posted

技术标签:

【中文标题】MySql 选择每个国家的前 3 个结果【英文标题】:MySql select top 3 results from each country 【发布时间】:2013-10-10 08:35:19 【问题描述】:

这是我的问题......(非常感谢 mysql 专家的任何建议)

我有一个数据库表指定: 时间(9.99、10.96、11.02 等) 国家(例如 JAM、美国、CAN 等) 日期(例如 2011、2012、2013 等)

我希望显示指定年份 (2012) 的按时间 (ASC) 排序的排名列表

问题 - 我只想在每个国家/地区最多显示三个条目,并且列表必须按时间 (ASC) 排序

我已经尝试过(来自这里的另一个建议):

set @num := 0, @country := '';
select country, time
from (
select country, time,
  @num := if(@country = country, @num + 1, 1) as row_number,
  @country := country as dummy
from stats

where eventID = 1
order by country
) as x where x.row_number <= 3;

不过,这在一定程度上是可行的 - 但它会按国家/地区(按字母顺序)对列表进行排序。

抱歉,如果这含糊不清..但会喜欢一些想法!!!

非常感谢!

【问题讨论】:

所以订购别的东西!?!?!还在苦苦挣扎?考虑发布适当的 DDL 和/或 sqlfiddle 连同所需的结果 在您的示例中 time 是十进制值? 9.99, 10.96, 11.02 这些值是什么意思?我看到您在日期列中保存了年份,但是时间到底包含什么?这是某种组合的月日日值吗?只是好奇 对不起,伙计们,对这个很陌生...这里是 sqlfiddle sqlfiddle.com/#!2/bc5a9/1 【参考方案1】:

试试这个:

SET @n=0,@s=-1;
SELECT
    country,
    time
FROM (
    SELECT
        country,
        time,
        @n:=IF(@s=-1 OR @s=country,@n+1,1) as n,
        @s:=country
    FROM
        stats
    ORDER BY
        country
) as tmp
WHERE
    n <= 3
ORDER BY
    time

【讨论】:

谢谢 - 差不多了!我已经设置了这个 sqlfiddle,以便更好地了解我想要达到的目标sqlfiddle.com/#!2/bc5a9/1 按时最快到最慢 - 每个国家/地区不超过三个结果 @GavinLovegrove 很高兴听到它:) 不要忘记接受答案,以便其他人可以看到解决方案

以上是关于MySql 选择每个国家的前 3 个结果的主要内容,如果未能解决你的问题,请参考以下文章

R语言处理1975-2011年的人口信息

MySQL:如何获得每个分组的 x 个结果 [重复]

Spark 获取每个(item1,item2,score)的前 N ​​个最高分结果

SQLite:仅返回每组中的前 2 个结果

存储过程mysql从每一行返回每个结果列

mysql按字段分组并获取每个分组按照某个字段排序的前三条