在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中使用窗口函数创建重复排名的主要内容,如果未能解决你的问题,请参考以下文章

MySQL8.0窗口函数之排名函数(rankdense_rank)的使用

MySQL8.0窗口函数实践及小结

窗口函数--排序函数

SQL中的窗口函数总结

创建自定义窗口函数

Postgres UPDATE 使用排名窗口函数