mysql - 按结果集对分组进行排名

标签 mysql sql ranking

我想要一列显示该结果集的排名(最高数量为#1)。这可以以某种方式完成吗? 这是生成 this result 的查询:

SELECT user_names.user_name,city.city,state.state,SUM(events_full.amount) AS total
FROM user_names,city,state,events_full
WHERE user_names.user_id=events_full.user_id 
AND city.city_id=events_full.city_id 
AND state.state_id=events_full.state_id 
AND events_full.season_id=13
AND amount > 0
Group By user_names.user_name

最佳答案

我有预感,您实际上使用的是 MariaDB。
(基于您在已删除答案中的评论)

然后你可以尝试添加 DENSE_RANK通过 SUM 到您的 SELECT

DENSE_RANK() OVER (ORDER BY SUM(events_full.amount) DESC) AS Ranking

一个简单的例子:

create table test 
(
  col1 int,
  col2 int
);

insert into test values
(1,1),(1,2),(1,3),
(2,1),(2,2),(2,3),(2,4),
(3,1),(3,5),
(4,1),(4,2);
select col1
, sum(col2) tot
, dense_rank() over (order by sum(col2) desc) rnk
from test
group by col1
order by rnk
col1 | tot | rnk
---: | --: | --:
   2 |  10 |   1
   1 |   6 |   2
   3 |   6 |   2
   4 |   3 |   3

db<> fiddle here

在 MySql 5.7 中可以通过变量来模拟

例如:

select *
from
(
  select col1, total
  , case 
    when total = @prev_tot 
     and @prev_tot := total
    then @rnk
    when @prev_tot := total
    then @rnk := @rnk + 1
    end as rnk
  from
  (
    select col1
    , sum(col2) as total
    from test
    group by col1
    order by total desc
  ) q1
  cross join (select @rnk:=0, @prev_tot:=0) v
) q2
order by rnk;
col1 | total | rnk
---: | ----: | :--
   2 |    10 | 1  
   1 |     6 | 2  
   3 |     6 | 2  
   4 |     3 | 3  

db<> fiddle here

关于mysql - 按结果集对分组进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59391626/

相关文章:

python - UnicodeEncodeError - 尝试使用 Flask 插入 SQL 希伯来语字母

mysql - SQL:计算表中不同行值的数量

mysql - 'unsigned int ..' 附近未知的 CREATE TABLE 语法错误

algorithm - 具有子节点的节点的排名算法?

vba - 强制排名宏excel vba

python - 如何从 python 中的排名组中随机选择数字,以创建特定长度的列表

php - Openfire 不存储离线消息

sql - SQL Server 2008 中的拆分函数

sql - mysqldump 不创建表,然后尝试锁定/更改不存在的表

mysql - 合并 2 个表中具有相同名称的 2 个 Column