MySQL–ROW_NUMBER
MySQL–ROW_NUMBER
一、窗口函数
要讲row_number,首先得讲一下窗口函数。窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
窗口函数的基本语法如下:
<窗口函数> over (partition by <用于分组的列名>order by <用于排序的列名>)
<窗口函数>的位置,可以放以下两种函数:
1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。
2) 聚合函数,如sum. avg, count, max, min等
partition by用来对表分组。order by子句的功能是对分组后的结果进行排序。
因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。
二、row_number
在MySQL8.0版本中已支持row_number函数,接下来讲的内容基于MySQL5.7版本。
在8.0版本前无row_number函数,那么我们可以自己建一个类似row_number的功能。
以上为表TEMP_TEST的数据。
要模拟row_number()函数,必须使用会话变量。
1、每行添加序号
SET @row_number = 0;
SELECT( @row_number := @row_number + 1 ) AS ROW_NUMBER,ID,NAME,AGE,ADDRESS
from TEMP_TEST
ORDER by AGE;
-- 新写法
SELECT( @row_number := @row_number + 1 ) AS ROW_NUMBER,ID,NAME,AGE,ADDRESS
from TEMP_TEST a,(select @row_number := 0) b
ORDER by AGE;
2、每组添加序号
-- row_number()
SELECTROW_NUMBER() OVER(PARTITION BY AGE ORDER BY ID),ID,NAME,AGE,ADDRESS
FROMTEMP_TEST; -- 自定义
SELECT@row_number :=-- 若AGE相等则自增,若partition有多个字段则可以使用多个变量进行判断,如:@AGE = AGE and @ADDRESS = ADDRESSIF( @AGE = AGE, @row_number + 1, 1 ) AS ROW_NUMBER, @AGE := AGE AS AGE, -- 赋值partition字段ID,NAME,AGE,ADDRESS
FROMTEMP_TEST
ORDER BYAGE,ID DESC; -- 其它示例
select ROW_NUMBER() OVER(PARTITION BY pid,checked ORDER BY id) t , a.* from t_test_area a;
select @row_number := if(@pid = pid and @checked = checked, @row_number + 1, 1 ) row_number,@pid := pid, @checked := checked, t.*
from t_test_area t
order by pid,checked,id;
三、视图中使用row_number()
可参考:https://blog.csdn.net/weixin_45873444/article/details/119895410
我在做Oracle向MySQL的数据库迁移中遇到了视图中使用row_number()函数的情况,一起看一下怎么在MySQL中用上面的方法实现视图中的row_number()函数。
如果直接使用上面的方法会直接报错,这是因为MySQL在视图中不支持使用会话变量,所以我们只能创建一个函数来替代使用。
-- 一般写法
create function row_number()
returns INTEGER
return @row_number := @row_number + 1;
-- 带复位的写法
CREATE FUNCTION func_row_num(reset bit) RETURNS int(11)
beginif reset thenset @row_num := 0;elseset @row_num := ifnull(@row_num, 0) + 1;end if;return @row_num;
end
在视图中使用自建的函数即可实现视图中使用row_number()函数。
MySQL–ROW_NUMBER相关推荐
- MySQL ROW_NUMBER 函数
MySQL ROW_NUMBER()函数 为结果集中的每一行生成序列号 MySQL ROW_NUMBER()从8.0版开始引入了功能.这ROW_NUMBER()是一个窗口函数或分析函数,它为从1开始应 ...
- mysql row_number吗_MySQL中的ROW_NUMBER()是什么?
MySQL版本8.0中包含的Row_NUMBER().这是一种窗口函数.这可用于为行分配序列号.要了解,请借助CREATE pcommand创建一个表- 建立表格CREATE table rowNum ...
- mysql排序两位数_MySQL_Mysql row number()排序函数的用法和注意,虽然使用不多,但是也有情况 - phpStudy...
Mysql row number()排序函数的用法和注意 虽然使用不多,但是也有情况是需要在mysql 里面写语句开发功能的.在sql server 使用惯了,习惯了使用row_number() 函数 ...
- mysql排名函数使用
1.percent_rank()函数 PERCENT_RANK()函数计算分区或结果集中行的百分位数排名这PERCENT_RANK()是一个窗口函数, 用于计算分区或结果集中行的百分位数. 以下显示了 ...
- Mysql常用函数之Rank 排名函数
mysql中的排名函数 主要介绍一下mysql里面的排名函数,涉及到的函数有以下几个: rank().dense_rank().row_number() 1.准备工作 建立一个rank表: creat ...
- sql EXPLAIN 详解 type\rows
Explain MySql提供了Explain命令,它可以对你的sql语句进行分析,返回你的sql执行的详细信息,以供开发人员针对性进行优化. 我们可以查看该sql是否使用索引.是否做全表扫描.性能瓶 ...
- mysql col与row_使用mysql实现row_number() over(partition by col1 order by col2)函数
[color=red]row_number() OVER (PARTITION BY COL1 ORDER BY COL2)[/color] 表示根据COL1分组,在分组内部根据 COL2排序,而此函 ...
- 【原创】MySQL 实现Oracle或者PostgreSQL的row_number over 这样的排名语法
PostgreSQL 和Oracle 都提供了 row_number() over() 这样的语句来进行对应的字段排名, 很是方便. MySQL却没有提供这样的语法. 最近由于从Oracle 迁移到 ...
- mysql实现row_number()和row_number() over(partition by)
row_number() 仅仅是价格排序字段 select @rownum := @rownum + 1 as rn, t.*from (select @rownum := 0) r, test_ta ...
- Mysql @RN :方式ROW_NUMBER的实现方法
目录 1简介... 1 2 准备... 1 2.1 环境说明... 1 3 安装... 2 4 配置... 2 5 使用... 2 5.1 验证实验... 2 5.2 问题分析... 4 6 延展.. ...
最新文章
- 有符号数据的符号位扩展
- shell 输入输出重定向
- C语言 | 编程实现2
- 接收超时死信的死信交换机
- 用“Web的思想”做PC客户端
- poj 1256 Anagram—next_permutation的神奇应用
- cross_val_score 如何对孤立森林_【收藏】森林防火手抄报素材汇总!
- python中curve fit_scipy.optimize.curve_fit函数用法解析
- kotlin-2(IdeaIU-2018.2汉化破解)
- django -- url 的 命名空间
- 人工智能入门——机器学习小案例(二)
- 深度学习入门:基于Python的理论与实现——第一章Python入门
- 苹果6s强制删除id锁_付费苹果解锁软件 屏幕解锁及AppleID解锁
- 通过R访问世界银行数据(World Bank Data)分析经济
- 饭店点餐系统的设计与实现
- 计算机操作者权限恢复,win10系统提示“需要管理员权限”的还原方案
- html图片标签img的介绍以及基本用法详解
- 极限编程-拥抱变化阅读感想(一)
- 渗透测试思路 - 工具篇
- MAC系统免驱显卡汇总