首先说一下十进制和二进制之间是怎么转换的
以正整数转换二进制为例:
将正的十进制数除以二,得到的商再除以二,依次类推直到商为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;