在mysql中使用窗口函数创建重复排名
Posted
技术标签:
【中文标题】在mysql中使用窗口函数创建重复排名【英文标题】:Creating duplicate rankings with window function in mysql 【发布时间】:2021-04-08 17:31:55 【问题描述】:我有一张如下表:
product | country | group | value |
---|---|---|---|
p1 | c1 | g1 | 5 |
p1 | c1 | g2 | 6 |
p1 | c2 | g1 | 3 |
p1 | c2 | g2 | 22 |
p1 | c3 | g1 | 1 |
p1 | c3 | g2 | 6 |
我想考虑每个产品国家组合的价值列中的总和来对它们进行排名。所以在这种情况下,更新后的表应该是这样的:
product | country | group | value | rank |
---|---|---|---|---|
p1 | c1 | g1 | 5 | 2 |
p1 | c1 | g2 | 6 | 2 |
p1 | c2 | g1 | 3 | 1 |
p1 | c2 | g2 | 22 | 1 |
p1 | c3 | g1 | 1 | 3 |
p1 | c3 | g2 | 6 | 3 |
p1-c1 组合将具有第二个种子,因为 value 列中的 5+6 高于 7 (1+6) 且低于 25 (22+3)。我使用了dense_rank() over (partition by product, country order by value)
,但它没有用。如何使用mysql创建上述排名?
谢谢,
【问题讨论】:
【参考方案1】:首先在子查询中使用SUM()
窗口函数获取每个产品、国家组合的总值,然后DENSE_RANK()
对总值进行排名:
select product, country, `group`, value,
dense_rank() over (order by total desc) rnk
from (
select *, sum(value) over (partition by product, country) total
from tablename
) t
请参阅demo。
【讨论】:
以上是关于在mysql中使用窗口函数创建重复排名的主要内容,如果未能解决你的问题,请参考以下文章