sql 中常用的窗口排序函数

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

结果:
在这里插入图片描述

  1. 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’
    在这里插入图片描述

  2. 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'

在这里插入图片描述

  1. 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'

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值