SQL常用的四个排序函数梳理

目录
  • 前言
  • 1.ROW_NUMBER()
    • 1.1 对学生成绩排序示例
  • 2.RANK()
  • 3.DENSE_RANK()
  • 4.NTILE()

前言

今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server排序中经常用到的ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()这四个好兄弟。

我们在写SQL代码时,只要有排序,首先想到的肯定是ORDER BY,以至于好多小伙伴觉得排序多简单啊。

今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server排序中经常用到的ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()这四个好兄弟。

我们先创建一个测试数据表Scores:

WITH t AS
(SELECT 1 StuID,70 Score
UNION ALL
SELECT 2,85
UNION ALL
SELECT 3,85
UNION ALL
SELECT 4,80
UNION ALL
SELECT 5,74
)
SELECT * INTO Scores FROM t;
SELECT * FROM Scores

结果如下:

1.ROW_NUMBER()

定义:ROW_NUMBER()函数作用就是将SELECT查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询,比如查询前10个 查询10-100个学生。

1.1 对学生成绩排序示例

SELECT
ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

结果如下:

这里RANK就是每个学生的排名后的次序, 根据Score进行DESC倒序

1.2 获取第2名的成绩信息 

SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores
) t WHERE t.RANK=2;

结果:

这里用到的思想就是 分页查询的思想 在原sql外再套一层SELECTWHERE t.RANK>=1 AND t.RANK<=3 是不是就是获取前三名学生的成绩信息了。

2.RANK()

定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里和ROW_NUMBER()有什么不一样呢?ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样。如果出现相同的,他们的排名是一样的。下面看例子:

示例:

SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;
SELECT RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

结果:

上面是ROW_NUMBER()函数的结果,下面是RANK()函数的结果。

当出现两个学生成绩相同是里面出现变化。RANK()是1-1-3-4-5,而ROW_NUMBER()则还是1-2-3-4-5,这就是RANK()和ROW_NUMBER()的区别了

3.DENSE_RANK()

定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?特别是对于有成绩相同的情况,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,一般情况下用的排名函数就是RANK() 我们看例子

示例:

SELECT
RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

SELECT
DENSE_RANK() OVER (ORDER BY SCORE DESC) AS [RANK],*
FROM Scores;

结果:

上面是RANK()的结果,下面是DENSE_RANK()的结果。

4.NTILE()

定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的'分区'一样 ,分为几个区,一个区会有多少个。

SELECT NTILE(1) OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores;
SELECT NTILE(2) OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores;
SELECT NTILE(3) OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores;

结果:

就是将查询出来的记录根据NTILE函数里的参数进行平分分区。

到此这篇关于SQL常用的四个排序函数梳理的文章就介绍到这了,更多相关SQL排序函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SQL Server 排序函数 ROW_NUMBER和RANK 用法总结

    1.ROW_NUMBER()基本用法: SELECT  SalesOrderID,  CustomerID,  ROW_NUMBER() OVER (ORDER BY SalesOrderID) AS RowNumber FROM Sales.SalesOrderHeader结果集:SalesOrderID    CustomerID    RowNumber--------------- ------------- ---------------43659           676     

  • Mysql8.0使用窗口函数解决排序问题

    MySQL窗口函数简介 MySQL从8.0开始支持窗口函数,这个功能在大多商业数据库和部分开源数据库中早已支持,有的也叫分析函数. 什么叫窗口? 窗口的概念非常重要,它可以理解为记录集合,窗口函数也就是在满足某种条件的记录集合上执行的特殊函数.对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口:有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口. 窗口函数和普通聚合函数也很容易混淆,二者区别如下: 聚合函数是将多条记录聚合为一条:

  • MySQL 聚合函数排序

    目录 MySQL 结果排序-- 聚集函数 环境 查询结果排序 查询的分组与汇总 查一下 学生们平均年龄 查一下总人数是多少 查一下每个年龄有多少人 查出最大年龄 总结 MySQL 结果排序-- 聚集函数 环境 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号', `student_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_c

  • Mysql row number()排序函数的用法和注意

    虽然使用不多,但是也有情况是需要在mysql 里面写语句开发功能的.在sql server 使用惯了,习惯了使用row_number() 函数进行排序,但是mysql 确没有这样一个函数.然后找到了po主写的一篇 文章.通过变量赋值来查询的.(PS 我测试的版本是mysql 5.6) 先建表 CREATE TABLE `test` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Col1` varchar(50) DEFAULT NULL, `Col2` var

  • ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)

    语法: ROW_NUMBER() OVER([ <partition_by_clause>] <order_by_clause>) 备注: ORDER BY子句可确定在特定分区中为行分配唯一ROW_NUMBER的顺序. 参数: <partition_by_clause> 将FROM子句生成的结果集划入应用了ROW_NUMBER函数的分区. <order_by_clause> 确定将ROW_NUMBER值分配给分区中的行的顺序.有关详细信息,请参阅ORDER

  • mysql通过find_in_set()函数实现where in()顺序排序

    本文章来为各位介绍一篇关于mysql 实现按 where in () 中的顺序排序,用find_in_set() 函数的教程,希望此教程能够对各位有所帮助. select * from table where id in ('783',' 769',' 814',' 1577',' 1769') order by find_in_set( id, '783, 769, 814, 1577, 1769' ) 查出来: 769 1577 814 1769 783 为什么不是 783 769 814

  • 浅谈MySQL中group_concat()函数的排序方法

    group_concat()函数的参数是可以直接使用order by排序的.666.. 下面通过例子来说明,首先看下面的t1表. 比如,我们要查看每个人的多个分数,将该人对应的多个分数显示在一起,分数要从高到底排序. 可以这样写: SELECT username,GROUP_CONCAT(score ORDER BY score DESC) AS myScore FROM t1 GROUP BY username; 效果如下: 以上这篇浅谈MySQL中group_concat()函数的排序方法就

  • MySQL中的排序函数field()实例详解

    前言 我们在日常开发过程中,排序是经常用到的,有时候有这样的需求. 比如,需要在查询结果中根据某个字段的具体值来排序.如下面例子 上面是一张个人信息 表,假如我们想按照'seiki','iris','xut'来排序.也就是name='seiki','iris','xut'的来排序. 碰到这样的需求,我们应该怎么做呢,其实有一个MySQL函数可以非常方便的处理此需求 那就是field()函数 使用方式如下 其中,order by (str,str1,str2,str3,str4--) ,str与s

  • PostgreSQL聚合函数的分组排序使用示例

    聚合函数 用于汇总的函数. COUNT COUNT,计算表中的行数(记录数). 计算全部数据的行数: SELECT COUNT(*) FROM Product; NULL之外的数据行数: SELECT COUNT(purchase_price) FROM Product; 结果如下图. 对于一个含NULL的表: 将列名作为参数,得到NULL之外的数据行数:将星号作为参数,得到所有数据的行数(包含NULL). SUM.AVG SUM.AVG函数只能对数值类型的列使用. SUM,求表中的数值列的数据

  • SQL常用的四个排序函数梳理

    目录 前言 1.ROW_NUMBER() 1.1 对学生成绩排序示例 2.RANK() 3.DENSE_RANK() 4.NTILE() 前言 今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server排序中经常用到的ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()这四个好兄弟. 我们在写SQL代码时,只要有排序,首先想到的肯定是ORDER BY,以至于好多小伙伴觉得排序多简单啊. 今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server

  • SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较

    排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 下面分别介绍一下这四个排名函数的功能及用法.在介绍之前假设有一个t_table表,表结构与表中的数据如图1所示: 图1 其中field1字段的类型是int,field2字段的类型是varchar 一.row_number row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号

  • PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】

    本文实例讲述了PHP四种排序算法实现及效率分析.分享给大家供大家参考,具体如下: PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数来. //简单版: function bubbleSort($arr) { $n = count($arr); for($i=1;$i<$n;$i++) { //冒泡的轮数(最多$n-1轮) for($j=0;$j<

  • SQL 聚合、分组和排序

    目录 一.聚合查询 1.COUNT 函数 2.SUM 函数 3.AVG 函数 4.MAX 函数和 MIN 函数 二.分组查询 三.对聚合结果进行过滤 1.HAVING 子句的构成要素 四.对查询结果进行排序 1. 指定多个排序键 2. 使用聚合函数排序 一.聚合查询 在访问数据库时,经常要对表中的某列数据进行统计汇总,如求和.最大值.最小值.平均值等,这时就需要使用聚合函数,所谓聚合函数,就是用于汇总的函数,聚合就是将多行汇总为一行, 常见的聚合函数如下: 1.COUNT 函数 count函数用

  • mysql sql常用语句大全

    一 .常用操作数据库的命令 show databases; 查看所有的数据库 create database test; 创建一个叫test的数据库 drop database test;删除一个叫test的数据库 use test;选中库 ,在建表之前必须要选择数据库 show tables; 在选中的数据库之中查看所有的表 create table 表名 (字段1 类型, 字段2 类型); desc 表名;查看所在的表的字段 drop table 表名; 删除表 show create da

  • 常用的JS验证和函数汇总

    下面是我常用一些JS验证和函数,有一些验证我直接写到了对象的属性里面了,可以直接通过对象.方法来调用 复制代码 代码如下: //浮点数除法运算 function fdiv(a, b, n) {     if (n == undefined) { n = 2; }     var t1 = 0, t2 = 0, r1, r2;     try { t1 = a.toString().split(".")[1].length } catch (e) { }     try { t2 = b

  • Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法

    一. lamda匿名函数 为了解决一些简单的需求而设计的一句话函数 # 计算n的n次方 def func(n): return n**n print(func(10)) f = lambda n: n**n print(f(10)) lambda表示的是匿名函数. 不需要用def来声明, 一句话就可以声明出一个函数 语法: 函数名 = lambda 参数: 返回值 注意: 1. 函数的参数可以有多个. 多个参数之间用逗号隔开 2. 匿名函数不管多复杂. 只能写一行, 且逻辑结束后直接返回数据 3

  • python如何实现常用的五种排序算法详解

    一.冒泡排序 原理: 比较相邻的元素.如果第一个比第二个大就交换他们两个 每一对相邻元素做同样的工作,直到结尾最后一对 每个元素都重复以上步骤,除了最后一个 第一步: 将乱序中的最大值找出,逐一移到序列最后的位置 alist = [3, 5, 9, 2, 1, 7, 8, 6, 4] def bubble_sort(alist): # 找最大值的方式是通过对列表中的元素进行两两比较,值大的元素逐步向后移动 # 序列中有n个元素,两两比较的话,需要比较n-1次 for i in range(len

随机推荐