异或运算与rank() over,dense_rank() over和row_number() over区别

本文详细解释了十进制与二进制之间的转换方法,包括正整数转换为二进制的过程,并介绍了异或运算的基本规则及其在自然数排名中的应用。通过实例演示如何使用dense_rank()和row_number()函数实现分数排名的连续性和不连续性处理。
摘要由CSDN通过智能技术生成

首先说一下十进制和二进制之间是怎么转换的
以正整数转换二进制为例:
将正的十进制数除以二,得到的商再除以二,依次类推直到商为0或1时为止,然后在旁边标出各步的余数,最后倒着写出来,高位补零,如下:
在这里插入图片描述
42的二进制数是101010
再把这个二进制转换成十进制怎么转换呢?
如下,我们把每一位对应2的nc次方
在这里插入图片描述
在这里插入图片描述
如上即可转换为十进制42
好了知道如上的转换,我们还需要知道一点就是
^表示的是异或运算----异或运算的规则是,同位如果不同则为1,相同为0
比如:
0的二进制是00,1的二进制为01,0^1,得到二进制数01,即1,
1的二进制是01,1的二进制为01,1^1,得到二进制数00,即0,
2的二进制是10,1的二进制为01,2^1,得到二进制数11,即3,
同理
3的二进制是11,1的二进制为01,3^1,得到二进制数10,即2,
4的二进制是100,1的二进制为001,4^1,得到二进制数101,即5,
5的二进制是101,1的二进制为001,5^1,得到二进制数100,即4,
6的二进制是110,1的二进制为001,6^1,得到二进制数111,即7,
因此从0开始的自然数与1进行异或运算能够得到相邻奇偶数的互换。

再介绍一个概念:

#rank() over:查出指定条件后的进行排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占的名次
#dense_rank() over:两名学生的成绩并列以后,下一位同学并不空出所占的名次
#row_number() over:这个函数不需要考虑是否并列,哪怕根据条件查询出来的数值相同也会进行连续排名
**

1、如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
| Id | Score |
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
| Score | Rank |
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
我们可以使用dense_rank() over这样:
select Score, dense_rank() over(order by Score desc) ‘Rank’ from Scores;

2、相等后如果名次不连续呢?
| Score | Rank |
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 3 |
| 3.65 | 4 |
| 3.65 | 4 |
| 3.50 | 6 |
select Score, rank() over(order by Score desc) ‘Rank’ from Scores;

3、不管分数是否相同,直接排名次
| Score | Rank |
| 4.00 | 1 |
| 4.00 | 2 |
| 3.85 | 3 |
| 3.65 | 4 |
| 3.65 | 5 |
| 3.50 | 6 |

我们可以这样写:
select Score, row_number() over(order by Score desc) ‘Rank’ from Scores;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木土雨成小小测试员

你的鼓励将是我最大的创作动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值