Sql server 内有四个排名函数,分别是ROW_NUMBER()、RANK()、DENSE_RANK() 以及 NTILE() 。
ROW_NUMBER() 函数对查询到的结果进行简单的排序处理,可以对查询结果编排一个序号,并且不会重复。 配合OVER()语句使用,按照指定的字段进行排序。可以用于分页查询,取指定序号范围内的数据。
举个栗子:
-- 基本用法:row_num 就是 ROW_NUMBER() 根据 ID 字段升序排序的序号 select ROW_NUMBER() OVER(order by ID asc) AS row_num, * from USER -- 简单分页:取查询结果的 1 到 10 条 select * from ( select ROW_NUMBER() OVER(order by ID asc) AS row_num, * from USER ) AS A where A.row_num between 1 and 100 order by A.row_num
RANK()函数类似于上学时按照考试成绩排名,遇到两个人成绩相同就并列到一起。 例如,A、B考了一百分,则都并列第一名,下一个人是第三名而不是第二名,A、B就拥有相同的序号。 (如排名:1、1、3、4、5)
举个栗子:
-- 基本用法:row_num 就是 RANK() 根据 SCOORE 分数字段降序排序的排名 select RANK() OVER(order by SCOORE DESC) AS row_num, * from GRADE
DENSE_RANK() 函数与 RANK() 函数较为相似,区别在于 DENSE_RANK() 函数的排名是连续的。 例如,A、B考了一百分,则都并列第一名,但下一个人是接着上个序号继续编号,即排名第二名。 (如排名:1、1、2、3、4)
举个栗子:
-- 基本用法:row_num 就是 DENSE_RANK() 根据 SCOORE 分数字段降序排序的排名 select DENSE_RANK() OVER(order by SCOORE DESC) AS row_num, * from GRADE
NTILE() 函数则是按照指定组数,对数据进行等分分组排序。 (注:不能等分时,排序靠前的组的数据行数不能小于排序靠后的组的数据行数) 如:结果 10 条数据,指定组数为 2,则编号 1 组包含前 5 条数据,编号 2 组包含后 5 条数据。 指定组数为 4,则编号 1 组包含前 3 条数据,编号 2 组包含后面 3 条数据,编号 3 组包含后续两条数据,编号 4 组包含最后两条数据。
-- 基本用法 select NTILE(4) OVER(order by ID desc) as ntile, * from USER