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

问题描述:

我拥有大量用户的数据库,记录他们居住的地点以及他们登录网站的次数。我正在寻找每个城市中最活跃的用户。查询从表格中的组中选出最高的10个值或最高的10%

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

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

但是这将是能够找到每个城市的10对最活跃的用户来说非常实用。甚至更有用,但我认为在SQL中可能不可能,在活动方面排名前10%。

如果有人可以提出如何完成这两项任务或两项任务的想法,我将不胜感激。

我正在使用Navicat连接到这个任务的MySQL服务器。

+3

FWIW,**你当前的查询可以返回坏的结果**。既然你也不会在'user_id'上进行分组,你得到的'user_id'可能与'max(login_count')有关,除了MySQL之外的其他RDBMS迫使你将所有非聚合分组。 – JNK 2011-04-14 19:11:20

+1

你应该在这里找到你的答案http://*.com/questions/tagged/greatest-n-per-group+mysql – 2011-04-14 19:21:26

+0

嗨JNK,非常感谢你的回应 - 我完全不知道的东西。快速解释你将如何改变查询来避免这个问题?我也尝试了通过user_id进行分组,但是结果很奇怪... – user708580 2011-04-22 09:06:11

可以做到前10名:

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

我不想经常运行的查询,因为这将是相当缓慢,因为需要在一个临时表中的文件排序,如果你看在解释计划。

+0

查询没有意义。任何可以添加解释的机会 – 2011-04-14 19:27:23

+0

@ Imre是否意味着在@Joe提供的答案上发布此评论,因为该查询没有任何意义:) – Wes 2011-04-14 19:32:07

+2

这将只返回前10位,而不是前10位*每个城市* – 2011-04-14 19:48:22

如果您使用的是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

http://www.w3schools .COM/SQL/sql_top.asp – 2015-04-17 10:32:09