我想要一列显示该结果集的排名(最高数量为#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/