从表中的分组中挑选出最高的十个值或最高的10%的查询

3

我有一个包含大量用户信息的数据库,记录了他们所居住的城市和登录网站的次数。我想找到每个城市最活跃的用户。

我知道如何找到每个城市最活跃的单个用户:

select user_id, city, max(login_count)
from user
group by city 

但是能够找到每个城市最活跃的10个用户将非常有用。或者更有用的是,但我怀疑在SQL中可能不可能实现的是按活动量排名前10%的用户。

如果有人能提供如何完成这两个任务的想法,我将非常感激。

我正在使用Navicat连接到MySQL服务器进行此任务。


3
就你目前的查询而言,可能会返回错误的结果。由于你没有以user_id进行分组,所以你得到的user_id可能与max(login_count)无关。除MySQL之外的其他关系型数据库系统出于这个原因强制要求你对所有非聚合列进行分组。 - JNK
1
你应该在这里找到答案:http://stackoverflow.com/questions/tagged/greatest-n-per-group+mysql - Martin Smith
嗨JNK,非常感谢你的回复,这是我完全不知道的东西。你介意快速解释一下如何更改查询以避免此问题吗?我也尝试按user_id分组,但结果很奇怪... - user708580
2个回答

1
如果您正在使用MySql,可以使用SELECT TOP 10 PERCENT语句。
例如:
select top 10 percent * from (
    select user_id, city, max(login_count)
    from user
    group by user_id,city
    order by max(login_count)) 

0

你可以将它们排名前十:

select user_id
     , city
     , login_count
  from user
 group by user_id
     , city
 order by city
     , login_count desc
 limit 10

我不想经常运行那个查询,因为它会非常慢,如果你查看执行计划,它将需要在临时表上进行文件排序。


那个查询没有意义。你能否添加一个解释它的功能是什么? - Imre L
@Imre,你是不是想在@Joe提供的答案下发表这个评论?因为那个查询语句没有任何意义 :) - Wes
2
这将仅返回前10个,而不是每个城市的前10个。 - Daniel DiPaolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接