您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > 数据库技术 > MySQL

MySQL 如何实现 ROW_NUMBER 函数功能详解

作者:UncleToo  来源:原创  日期:2014-12-05 9:39:35
收藏  评论:( 0 )  阅读:1372

MySQL 如何实现 ROW_NUMBER 函数功能详解

       在前面的教程中,我们简单的在MySQL中实现了row_number函数功能(在MySQL中实现Oracle的row_number()函数功能),在本章MySQL教程中,我们将详细介绍几种实现 row_number 函数功能的方法及应用。

       row_number 函数是一个返回记录行序号的函数,从第一行1开始,依次递增,使用起来非常便捷。非常不幸的是,在MySQL数据库中不支持该函数(MSSQL和ORACLE数据库中支持),因此,我们需要通过其他方法来实现。


为每一行记录添加行号

方法一:

       为了实现row_number函数功能,此方法我们要使用到会话变量,下面的实例是从 employees 表中选出5名员工,并为每一行添加行号:

SET  @row_number = 0;
 SELECT
    (@row_number:=@row_number + 1)  AS  num, firstName, lastName
 FROM
    employees
 LIMIT  5;

输出结果:

在这个实例中:

  • 首先,定义变量 @row_number ,并初始化为0;

  • 然后,在查询时我们为 @row_number 变量加1。


方法二:

       这种方法仍然要用到变量,与上一种方法不同的是,我们把变量当做派生表,与主业务表关联查询实现row_number函数功能。下面我们仍然以查询5位员工为例:

SELECT
    (@row_number:=@row_number + 1) AS num, firstName, lastName
FROM
    employees,(SELECT @row_number:=0) AS t
LIMIT 5;

这样的输出结果与上一种结果是一致的。

需要注意的是,在这种方法中,派生表必须要有别名,否则执行时会出错。


为每一组添加行号

       了解ORACLE的朋友应该知道,row_number函数还有一个非常有用的功能就是分组排序 “over partition by” 。MySQL同样可以实现这样的功能,看下面的实例:

首先将payments表中按照客户将记录分组:

SELECT
    customerNumber, paymentDate, amount
 FROM
    payments
 ORDER BY  customerNumber;

输出结果如下:

下面我们需要将每个客户添加一个行号,这里我们需要用到两个变量,一个用于存储行号,一个用于存储客户编号,如:

SELECT
    @row_number := CASE
         WHEN  @customer_no = customerNumber  THEN  @row_number + 1
         ELSE  1
     END   AS  num,
    @customer_no := customerNumber  as  CustomerNumber,
    paymentDate,
    amount
 FROM
    payments
 ORDER BY  customerNumber;

在查询中我们使用了CASE WHEN语句,如果客户编号不变,则@row_number不变,否则@row_number加1自增。

同样,我们还可以使用派生表与业务主表关联查询的方式实现这一功能,如:

SELECT
    @row_number := CASE
         WHEN  @customer_no = customerNumber  THEN  @row_number + 1
         ELSE  1
     END   AS  num,
    @customer_no := customerNumber  as  CustomerNumber,
    paymentDate,
    amount
 FROM
    payments,( SELECT  @customer_no := 0,@row_number := 0)  as  t
 ORDER BY  customerNumber;

到此,关于MySQL如何实现row_number函数功能的教程结束,希望对大家有所帮助!




除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/mysql/1060.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论