排名函数
排名函数就是对开窗后查询的结果进行排名,其中rank、dense_rank、row_number、ntile均为排名函数和开窗配合使用返回特定的排名结果。
- 当使用rank函数出现相同排名时,相同的排名使用相同的排名号且后续排名号依次递增跳过,例如a和b并列排名号为1下一个数据c排名号则为3,rank函数不支持只包括分区的情况。
- 当使用dense_rank函数出现相同排名时,相同排名使用相同的排名号且后续排名号依次递增不跳过,例如a和b并列排名号为1下一个数据c的排名号则为2,dense_rank函数不支持只包括分区的情况。
- row_number函数为每一组的行按顺序生成一个唯一的排名号,排名号从1开始,依次递增,row_number函数不支持只包括分区的情况。
- ntile按照指定的数目将数据进行分组,并为每一组生成一个序号,将每组的序号分配给每一行,ntile函数不支持只包括分区的情况。
- rank、dense_rank、row_number为无参函数,ntile为单参数函数,其中参数表示需要分配的组数。
示例
示例1
rank排名sqlCREATE TABLE sal_info(id INT IDENTITY(1,1),name VARCHAR,deptno INT,sal NUMERIC(10,2)); INSERT INTO sal_info VALUES(DEFAULT,'张三',10,5000); INSERT INTO sal_info VALUES(DEFAULT,'李四',10,5500); INSERT INTO sal_info VALUES(DEFAULT,'王五',10,4500); INSERT INTO sal_info VALUES(DEFAULT,'赵六',10,4800); INSERT INTO sal_info VALUES(DEFAULT,'陈七',10,5500); INSERT INTO sal_info VALUES(DEFAULT,'刘八',20,3000); INSERT INTO sal_info VALUES(DEFAULT,'李九',20,3500); INSERT INTO sal_info VALUES(DEFAULT,'周十',20,3800); INSERT INTO sal_info VALUES(DEFAULT,'张一',20,2300); INSERT INTO sal_info VALUES(DEFAULT,'李二',20,3500); INSERT INTO sal_info VALUES(DEFAULT,'吴二',20,3800); INSERT INTO sal_info VALUES(DEFAULT,'张二',20,3800); INSERT INTO sal_info VALUES(DEFAULT,'刘二',20,4000); INSERT INTO sal_info VALUES(DEFAULT,'周二',20,4300); SQL> SELECT *,RANK() OVER(PARTITION BY deptno ORDER BY sal) rk FROM sal_info ORDER BY deptno,rk; ID | NAME | DEPTNO | SAL | RK | ------------------------------------------------------------------------------ 3 | 王五| 10 | 4500| 1 | 4 | 赵六| 10 | 4800| 2 | 1 | 张三| 10 | 5000| 3 | 5 | 陈七| 10 | 5500| 4 | 2 | 李四| 10 | 5500| 4 | 9 | 张一| 20 | 2300| 1 | 6 | 刘八| 20 | 3000| 2 | 10 | 李二| 20 | 3500| 3 | 7 | 李九| 20 | 3500| 3 | 11 | 吴二| 20 | 3800| 5 | 8 | 周十| 20 | 3800| 5 | 12 | 张二| 20 | 3800| 5 | 13 | 刘二| 20 | 4000| 8 | 14 | 周二| 20 | 4300| 9 |
示例2
dense_rank排名sqlSQL> SELECT *,DENSE_RANK() OVER(PARTITION BY deptno ORDER BY sal) dr FROM sal_info ORDER BY deptno,dr; ID | NAME | DEPTNO | SAL | DR | ------------------------------------------------------------------------------ 3 | 王五| 10 | 4500| 1 | 4 | 赵六| 10 | 4800| 2 | 1 | 张三| 10 | 5000| 3 | 5 | 陈七| 10 | 5500| 4 | 2 | 李四| 10 | 5500| 4 | 9 | 张一| 20 | 2300| 1 | 6 | 刘八| 20 | 3000| 2 | 10 | 李二| 20 | 3500| 3 | 7 | 李九| 20 | 3500| 3 | 11 | 吴二| 20 | 3800| 4 | 8 | 周十| 20 | 3800| 4 | 12 | 张二| 20 | 3800| 4 | 13 | 刘二| 20 | 4000| 5 | 14 | 周二| 20 | 4300| 6 |
示例3
row_number排名sqlSQL> SELECT *,ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal) rn FROM sal_info ORDER BY deptno,rn; ID | NAME | DEPTNO | SAL | RN | ------------------------------------------------------------------------------ 3 | 王五| 10 | 4500| 1 | 4 | 赵六| 10 | 4800| 2 | 1 | 张三| 10 | 5000| 3 | 2 | 李四| 10 | 5500| 4 | 5 | 陈七| 10 | 5500| 5 | 9 | 张一| 20 | 2300| 1 | 6 | 刘八| 20 | 3000| 2 | 7 | 李九| 20 | 3500| 3 | 10 | 李二| 20 | 3500| 4 | 8 | 周十| 20 | 3800| 5 | 11 | 吴二| 20 | 3800| 6 | 12 | 张二| 20 | 3800| 7 | 13 | 刘二| 20 | 4000| 8 | 14 | 周二| 20 | 4300| 9 |
示例4
ntile排名sqlSQL> SELECT *,NTILE(5) OVER(PARTITION BY deptno ORDER BY sal) nt FROM sal_info ORDER BY deptno,nt; ID | NAME | DEPTNO | SAL | NT | ------------------------------------------------------------------------------ 3 | 王五| 10 | 4500| 1 | 4 | 赵六| 10 | 4800| 2 | 1 | 张三| 10 | 5000| 3 | 2 | 李四| 10 | 5500| 4 | 5 | 陈七| 10 | 5500| 5 | 9 | 张一| 20 | 2300| 1 | 6 | 刘八| 20 | 3000| 1 | 10 | 李二| 20 | 3500| 2 | 7 | 李九| 20 | 3500| 2 | 8 | 周十| 20 | 3800| 3 | 11 | 吴二| 20 | 3800| 3 | 13 | 刘二| 20 | 4000| 4 | 12 | 张二| 20 | 3800| 4 | 14 | 周二| 20 | 4300| 5 |