1 需求背景
遇到一个需求是这样的,对学生的成绩进行排名,成绩为0的,排名值为null。成绩大于0的,如,3、3、2、1,排序出来为1、1、2、3。如图
这就是一个dense rank的需求,另外比较麻烦的是要处理成绩为0的情况。
2 解决方案
解决方案如图:
3 相关脚本
drop table myt;
create table myt as
select 3 score
union all select 3 score
union all select 2 score
union all select 0 score;
select * from myt;
SELECT
main.score,
(
SELECT
case when main.score<=0 then null else
COUNT(DISTINCT score) end
FROM
myt sub
WHERE
main.score < sub.score
) + 1 rank
FROM
myt main
ORDER BY rank is null,rank;
4 其它
4.1 ORDER BY rank is null 是让null排到最后,因为MySQL没有类似Oracle的nulls last这类的语句。
4.2 可以试下以下几种语句,看是什么样的结果
select null+1 ;
select count(null);
select sum(null);
select count(distinct c1) from(
select 1 c1
union ALL
select 1 c1
) t;
select count(c1) from(
select 1 c1
union ALL
select 1 c1
) t;