row_number函数的不稳定性
本文分享自华为云社区《row_number函数的不稳定性》,作者: nullptr_ 。
row_number为窗口函数,用来为各组内数据生成连续排号
基础用法
postgres=# select id,name,age,row_number() over() from test;
id | name | age | row_number
----+------+-----+------------
2 | 张三 | 13 | 1
3 | 张四 | 16 | 2
3 | 张三 | 14 | 3
1 | 张三 | 12 | 4
3 | 张四 | 15 | 5
(5 rows)
postgres=# select id,name,age,row_number() over(order by age) from test;
id | name | age | row_number
----+------+-----+------------
3 | 张四 | 16 | 5
3 | 张三 | 14 | 3
3 | 张四 | 15 | 4
1 | 张三 | 12 | 1
2 | 张三 | 13 | 2
(5 rows)
postgres=# select id,name,age,row_number() over(partition by name order by age) from test;
id | name | age | row_number
----+------+-----+------------
1 | 张三 | 12 | 1
2 | 张三 | 13 | 2
3 | 张三 | 14 | 3
3 | 张四 | 15 | 1
3 | 张四 | 16 | 2
(5 rows)
特殊用法
postgres=# select * from test1 where id in (1,2,4);
id | info
----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 | 张三,12;张三,13;张三,14
1 | 张四,13;张四,16;张四,17
4 | 张十一,14;张十一,13;张十一,16;张十一,146;张十一,136;张十一,166;张十一,46;张十一,36;张十一,66;张十一,246;张十一,236;张十一,26;张十一,36;张十一,76;张十一,17;张十一,13;张十一,15;张十一,19;张十一,10;张十一,6;张十一,966
(3 rows)
需求:将表中info字段转成行,并按照存储顺序生成组内序号。
将字段info 通过函数regexp_split_to_table用分号作为分隔符转成行,通过split_part将各行分段输出
postgres=# select split_part(c.a,',',1) as name, split_part(c.a,',',2) as age from (select regexp_split_to_table(info,';') as a from test1 where id in (1,2,4)) c;
name | age
--------+-----
张十一 | 14
张十一 | 13
张十一 | 16
张十一 | 146
张十一 | 136
张十一 | 166
张十一 | 46
张十一 | 36
张十一 | 66
张十一 | 246
张十一 | 236
张十一 | 26
张十一 | 36
张十一 | 76
张十一 | 17
张十一 | 13
张十一 | 15
张十一 | 19
张十一 | 10
张十一 | 6
张十一 | 966
张四 | 13
张四 | 16
张四 | 17
张三 | 12
张三 | 13
张三 | 14
(27 rows)
增加组内行号
postgres=# select split_part(c.a,',',1) as name, split_part(c.a,',',2) as age,row_number() over (partition by name) from (select regexp_split_to_table(info,';') as a from test1 where id in (1,2,4)) c;
name | age | row_number
--------+-----+------------
张三 | 12 | 1
张三 | 13 | 2
张三 | 14 | 3
张十一 | 966 | 1
张十一 | 19 | 2
张十一 | 10 | 3
张十一 | 6 | 4
张十一 | 14 | 5
张十一 | 13 | 6
张十一 | 16 | 7
张十一 | 146 | 8
张十一 | 136 | 9
张十一 | 166 | 10
张十一 | 46 | 11
张十一 | 36 | 12
张十一 | 66 | 13
张十一 | 246 | 14
张十一 | 236 | 15
张十一 | 26 | 16
张十一 | 36 | 17
张十一 | 76 | 18
张十一 | 17 | 19
张十一 | 13 | 20
张十一 | 15 | 21
张四 | 16 | 1
张四 | 17 | 2
张四 | 13 | 3
(27 rows)
可见行号并非按照存储顺序进行赋值,使用sequence进行优化可实现相关需求
postgres=# create sequence test_seq;
CREATE SEQUENCE
postgres=# select split_part(c.a,',',1) as name, split_part(c.a,',',2) as age,row_number() over (partition by name order by c.line) from (select nextval('test_seq') as line, regexp_split_to_table(info,';') as a from test1 where id in (1,2,4)) c;
name | age | row_number
--------+-----+------------
张三 | 12 | 1
张三 | 13 | 2
张三 | 14 | 3
张十一 | 14 | 1
张十一 | 13 | 2
张十一 | 16 | 3
张十一 | 146 | 4
张十一 | 136 | 5
张十一 | 166 | 6
张十一 | 46 | 7
张十一 | 36 | 8
张十一 | 66 | 9
张十一 | 246 | 10
张十一 | 236 | 11
张十一 | 26 | 12
张十一 | 36 | 13
张十一 | 76 | 14
张十一 | 17 | 15
张十一 | 13 | 16
张十一 | 15 | 17
张十一 | 19 | 18
张十一 | 10 | 19
张十一 | 6 | 20
张十一 | 966 | 21
张四 | 13 | 1
张四 | 16 | 2
张四 | 17 | 3
(27 rows)
总结
row_number的排序是不稳定的,所以不会按照初始顺序进行输出,需要人为给定顺序。
号外!

华为将于2023年9月20-22日,在上海世博展览馆和上海世博中心举办第八届华为全联接大会(HUAWEICONNECT 2023)。本次大会以“加速行业智能化”为主题,邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁,从商业、产业、生态等方面探讨如何加速行业智能化。
我们诚邀您莅临现场,分享智能化的机遇和挑战,共商智能化的关键举措,体验智能化技术的创新和应用。您可以:
- 在100+场主题演讲、峰会、论坛中,碰撞加速行业智能化的观点
- 参观17000平米展区,近距离感受智能化技术在行业中的创新和应用
- 与技术专家面对面交流,了解最新的解决方案、开发工具并动手实践
- 与客户和伙伴共寻商机
感谢您一如既往的支持和信赖,我们热忱期待与您在上海见面。
大会官网:https://www.huawei.com/cn/events/huaweiconnect
欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。
row_number函数的不稳定性的更多相关文章
- ROW_NUMBER()函数的使用
SQL Server数据库ROW_NUMBER()函数的使用是本文我们要介绍的内容,接下来我们就通过几个实例来一一介绍ROW_NUMBER()函数的使用. 实例如下: .使用row_number()函 ...
- SQL Server数据库ROW_NUMBER()函数使用详解
SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_ ...
- Teradata 的rank() 和 row_number() 函数
Teradata数据库中也有和oracle类似的分析函数,功能基本一样.示例如下: RANK() 函数 SELECT * FROM salestbl ORDER BY 1,2; storeid p ...
- T-SQL利用Row_Number函数实现分页
SQL: CREATE PROCEDURE PagingViewTest ( @currentPageIndex INT, --页序号 @pageSize INT, --页大小 @pageCount ...
- 【ROW_NUMBER 函数(Transact-SQL)】
[ROW_NUMBER 函数(Transact-SQL)]返回结果集分区内行的序列号,每个分区的第一行从 1 开始. 注释: ROW_NUMBER() OVER (PARTITION BY COL1 ...
- 按某个字段来分组、编号的row_number()函数
本文参考 http://zhidao.baidu.com/link?url=8su4F16Et8Q0S3FmybwniJSI51Ms0AeVujcEXhyEaZh3u5LlOng5Xri_9zHsl7 ...
- [转]SQL2005后的ROW_NUMBER()函数的应用
SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...
- 【转载】Sqlserver数据库中无自增Id的情况下使用ROW_NUMBER()函数进行数据分页
在Sqlserver数据库中,如果查询表中含有自增长Id列,一般会采用select Top的方式来数据的分页操作.而实际上很多数据表设计的时候,不一定含有自增长Id列,那么数据库没有Id自增列的时候要 ...
- MSSQL sql server 2005/2008 row_number()函数应用之–删除表中重复记录,只保留一条不重复数据
转自:http://www.maomao365.com/?p=4942 下文主要讲述:重复数据只获取一条的方法 row_number函数在数据库中的功能是为每一行 按照一定的规则生成一个编号,我们常常 ...
- hive的row_number()函数
hive的row_number()函数 功能 用于分组,比方说依照uuid分组 组内可以依照某个属性排序,比方说依照uuid分组,组内按照imei排序 语法为row_number() over (pa ...
随机推荐
- 使用 Kubernetes 简化平台工程
平台工程在现代应用程序开发和部署中发挥的作用至关重要.随着软件应用程序变得越来越复杂和分散,对稳健且可扩展的基础设施的需求变得越来越重要.这就是平台工程的作用所在,它是支持整个软件开发生命周期的支柱. ...
- 【XXE实战】——浅看两道CTF题
[XXE实战]--浅看两道CTF题 上一条帖子[XXE漏洞]原理及实践演示对XXE的一些原理进行了浅析,于是写了两道CTF题巩固一下,顺便也记录一下第一次写出来CTF.两道题都是在BUU上找的:[NC ...
- 每天5分钟复习OpenStack(六)CPU虚拟化<2>
OpenStack是 一个IAAS(基础设施即服务)因此免不了会与硬件打交道.下面我介绍下与CPU强关联的一些知识点.1 什么是超配 2 CPU的个数是怎么统计的 3 vCPU的隔离.绑定 1.超配 ...
- JavaScript高级程序设计笔记02 HTML中的JavaScript
HTML中的JavaScript <script>元素 形式 行内 其中的代码会被从上到下解释.计算完成之前,页面其余内容不会被加载,也不会被显式. 外部 下载与解析都会阻塞HTML解析, ...
- 栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式
1 //1.实现对逆波兰输入的表达式进行计算如(2-1)*(2+3)= 5 就输入2 1 - 2 3 + * //先把2 1 压栈 遇到-弹栈 再把2 3压进去 遇到+弹栈 最后遇到*弹栈 2 //2 ...
- go基础-方法
概述 方法是面向对象编程 (OOP) 的一个特性,在 C++/Java 语言中方法是类函数,go做为函数式编程语言,通过特有技能支持相似的功能,所以说go也支持面向对象编程特性. go 方法本质也是函 ...
- python3 打包上传pypi失败及解决方法
1.打包及上传 1.1.安装构建和打包工具 pip3 install build # 构建包的工具 pip3 install twine # 上传包的工具 pip3 install wheel #he ...
- [ARC105E] Keep Graph Disconnected
题目链接 好题. 如果 \(1\) 和 \(n\) 一直联通,开始即结束. 如果 \(n\mod 4=1\),那么 \(\frac 12x(x+1)+\frac12(n-x)(n-x+1)\) 为偶数 ...
- Colaboratory使用教程
Google Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.同时 ...
- CompletableFuture进阶
CompletableFuture进阶 1.异步任务的交互 异步任务交互指将异步任务获取结果的速度相比较,按一定的规则( 先到先用 )进行下一步处理. 1.1 applyToEither applyT ...