sql中常用的四个窗口排序函数
1. row_number() over()
2. rank() over()
3. dense_rank() over()
4. ntile() over()
1.row_number() over(partition by fieldname order by fieldname desc/asc)
用途非常广,排序最好用,它会为查询出来的每一行添加一个序号,可以理解为行号,不会重复,partition by 用来限定排序的范围,如果不写,则直接在全表中排序。在over中设定以某一列排序,注意,这里的order by,与sql语句中的order by并不冲突,序列按照 over中的 order by排序,但是整个结果集,依然按照sql中的order by排序;
Select name,times ,money,ROW_NUMBER() over(PARTITION by name ORDER BY money desc) num
From syc
Group by name,times
结果:
-
rank() over(partition by fieldname order by fieldname desc/asc)
rank函数常用来返回结果集中的分区内每一行的排名,这里的排序可能出现重复,即排序的结果相同,这时序号不变,也就是并列名次,但是后边的排名会受影响select * ,rank() over (order by socre) from course
按照成绩排名,如果前两名的成绩相同则出现并列第一,但是不会再有第二名,直接出现第三名,会跳过空缺的名次;
SELECT *, rank() over( ORDER BY score desc) num
FROM sc
WHERE cno ='01’or cno=‘02’
-
dense_rank() over(partition by fieldname order by fieldname desc/asc)
dense_rank( )返回结果跟rank()类似,但是不会跳过空缺名次,即前两个人并列第一,第三人是第二名;
SELECT *, dense_rank() over( ORDER BY score desc) num
FROM sc
WHERE cno ='01'or cno='02'
- ntile() over()
ntile 可以对序号进行分组处理,之后按照规则将序号划分到不同的桶中,并返回桶号:
select ntile(4) over(order by score) as ‘桶’ ,* from course;
如果course中有六条记录,那么,会将这六条数据分别放到4个桶中,其中桶1–>2,桶2–>2,桶3–>1,桶4–>1;
桶中的存放规则:1、每一个组中的数据不能别上一组中多;
2、每一组中的数据要么相等,要么比上一组少,即尽量平均;
SELECT *, ntile(4) over( ORDER BY score asc) num
FROM sc
WHERE cno ='01'or cno='02'