排名(),dense_rank()和row_number()三者在postgresql中使用有什么不同

  介绍

本篇文章为大家展示了等级(),dense_rank()和row_number()三者在postgresql中使用有什么不同,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

如下学生表学生,学生表中有姓名,分数,课程编号,需要按照课程对学生的成绩进行排序

select  *,得到jinbo.student;   |,id  name  |, score  |, course    - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - -   ,5 |,elic  |, 70, |, 1   ,4 |,dock  |, 100, |, 1   ,3 |,cark  |, 80, |, 1   ,2 |,bob  |, 90, |, 1   ,1 |,alice  |, 60, |, 1   ,10 |,jacky  |, 80, |, 2   ,9 |,iris  |, 80, |, 2   ,8 |,hill  |, 60, |, 1   ,7 |,grace  |, 50, |, 2   ,6 |,frank  |, 70, |, 2   ,6 |,test  |,, |, 2   (11,行)

1,排名超过()可以把成绩相同的两名是并列,如下课程=2的结果等级值为:1 2 2 4 5

, select 名字,   分数,才能   当然,才能   排名(),才能在(partition  by  course  order  by  score  desc), as 等级   ,得到jinbo.student;   |,name  score  |, course  |, rank    - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - -   |,dock  100年,|,,1,|,1   |,bob  90年,|,,1,|,2   |,cark  80年,|,,1,|,3   |,elic  70年,|,,1,|,4   |,hill  60, |,, 1, |, 5   |,alice  60, |,, 1, |, 5   ,test  |, |,, 2, |, 1   |,iris  80年,|,,2,|,2   |,jacky  80年,|,,2,|,2   |,frank  70年,|,,2,|,4   ,grace  |, 50, |,, 2, |, 5   (11,行)

2, dense_rank在()()和排名很相似,可以把学生成绩并列不间断顺序排名,如下课程=2的结果等级值为:1 2 2 3 4

select 名字,分数,   当然,才能   dense_rank才能(),在(partition  by  course  order  by  score  desc), as 等级   ,得到jinbo.student;   |,name  score  |, course  |, rank    - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - -   |,dock  100年,|,,1,|,1   |,bob  90年,|,,1,|,2   |,cark  80年,|,,1,|,3   |,elic  70年,|,,1,|,4   |,hill  60, |,, 1, |, 5   |,alice  60, |,, 1, |, 5   ,test  |, |,, 2, |, 1   |,iris  80年,|,,2,|,2   |,jacky  80年,|,,2,|,2   |,frank  70年,|,,2,|,3   ,grace  |, 50, |,, 2, |, 4   (11,行)

3, row_number可以把相同成绩的连续排名,如下课程=2的结果等级值为:1 2 3 4 5

select 名字,分数,   当然,才能   row_number(),才能在(partition  by  course  order  by  score  desc), as 等级   ,得到jinbo.student;   |,name  score  |, course  |, rank    - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - -   |,dock  100年,|,,1,|,1   |,bob  90年,|,,1,|,2   |,cark  80年,|,,1,|,3   |,elic  70年,|,,1,|,4   |,hill  60, |,, 1, |, 5   |,alice  60, |,, 1, |, 6   ,test  |, |,, 2, |, 1   |,iris  80年,|,,2,|,2   |,jacky  80年,|,,2,|,3   |,frank  70年,|,,2,|,4   ,grace  |, 50, |,, 2, |, 5   (11,行)

使用等级超过()的时候,空值是最大的,如果排序字段为空,可能造成零字段排在最前的面,影响排序结果,可以如下:

排在(分区通过课程顺序最后得分desc null)

4,总结

分区,用于结果集分组,如果没有指定,会把整个结果集作为一个分组

, dense_rank, row_numer都是不同方式的结果集组内排的序,一般都结合在字句出现,在字的句里会有分区的顺序,最后,第一次的任意组合,如下:

等级(),在(partition  by  b  order  by ,, order  by  b  desc);   排名(),在(partition  by  a  order  by  b  nulls 第一次)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

排名(),dense_rank()和row_number()三者在postgresql中使用有什么不同