mysql 分组排序显示序列号
mysql没有row_number()函数,如何实现分组排序显示序列号
需求:要求分组统计后得出排名。如图1,根据组织分组后按绩效得分排名得图2效果。
表名:pef_score
(图1)
组织 | 供应商 | 绩效得分 |
---|---|---|
顺德工厂 | 智慧家居 | 80 |
顺德工厂 | 启明公司 | 90 |
广州工厂 | 创世公司 | 85 |
广州工厂 | 中山公司 | 90 |
广州工厂 | 合信公司 | 100 |
(图2)
组织 | 供应商 | 绩效得分 | 排名 |
---|---|---|---|
顺德工厂 | 智慧家居 | 80 | 1 |
顺德工厂 | 启明公司 | 90 | 2 |
广州工厂 | 创世公司 | 85 | 1 |
广州工厂 | 中山公司 | 90 | 2 |
广州工厂 | 合信公司 | 100 | 3 |
分析:一般用group by只能分组,mysql中没有rownum函数。所以只有3种思路实现:
1)用存储过程 (项目组要求尽量不用存储过程)
2)mysql关联查询技巧
3)在java代码层处理
这里采用思路2)快速简单实现功能。
SQL代码如下:
SELECT a.组织,a.供应商,a.绩效得分,count(*) AS 排名
FROM pef_score as a
LEFT JOIN pef_score as b
on a.组织 = b.组织
and a.绩效得分>= b.绩效得分
GROUP BY a.组织, a.绩效得分;
注:上述SQL的中文对应实际英文字段名称即可。
补充说明:
其实这种sql的处理有个漏洞,就是第1,2名的分数相同时候,该sql的结果是第一名的名次是从2开始。对于提及的3)在Java代码层处理 。请参考下面文章: