row_number函数的不稳定性

row,number,函数,不稳定性 · 浏览次数 : 23

小编点评

**row_number函数的不稳定性** **作者: nullptr_** **概要:** row_number函数在窗口函数中使用,但由于其不稳定性,会导致排序结果不按照存储顺序进行输出。 **解决方案:** 为了解决该问题,需要人为给定排序顺序。 **其他要点:** *华为云开发者联盟公众号将提供有关 Huawei云新鲜技术的最新信息和活动。 * 关注 Huawei Cloud 开发者联盟公众号,以获取会议议程、精彩活动和前沿干货。

正文

本文分享自华为云社区《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的排序是不稳定的,所以不会按照初始顺序进行输出,需要人为给定顺序。

号外!

cke_14906.jpeg

华为将于2023年9月20-22日,在上海世博展览馆和上海世博中心举办第八届华为全联接大会(HUAWEICONNECT 2023)。本次大会以“加速行业智能化”为主题,邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁,从商业、产业、生态等方面探讨如何加速行业智能化。

我们诚邀您莅临现场,分享智能化的机遇和挑战,共商智能化的关键举措,体验智能化技术的创新和应用。您可以:

  • 在100+场主题演讲、峰会、论坛中,碰撞加速行业智能化的观点
  • 参观17000平米展区,近距离感受智能化技术在行业中的创新和应用
  • 与技术专家面对面交流,了解最新的解决方案、开发工具并动手实践
  • 与客户和伙伴共寻商机

感谢您一如既往的支持和信赖,我们热忱期待与您在上海见面。

大会官网:https://www.huawei.com/cn/events/huaweiconnect

欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。

 

点击关注,第一时间了解华为云新鲜技术~

 

与row_number函数的不稳定性相似的内容:

row_number函数的不稳定性

row_number窗口函数的排序是不稳定排序,行的物理顺序可能会发生变化,通过巧妙的构思实现排序的稳定。

GaussDB(DWS)迁移实践丨row_number输出结果不一致

摘要:迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。 本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一致》,作者:譡里个檔 。 【问题表现】 迁移前后结果集row_number字段值前后不一致,前在DWS上运

[转帖]记录一则enq: TX - row lock contention的分析过程

https://www.cnblogs.com/jyzhao/p/8628184.html 故障描述:与客户沟通,初步确认故障范围大概是在上午的8:30-10:30之间,反应故障现象是Tomcat的连接数满导致应用无法连接,数据库alert中无明显报错,需要协助排查原因。 1.导入包含故障时刻的数据

[转帖]enq: TX - row lock contention故障处理一则

https://www.cnblogs.com/zhchoutai/p/7088826.html 一个非常easy的问题,之所以让我对这个问题进行总结。一是由于没我想象的简单,在处理的过程中遇到了一些磕磕碰碰,甚至绕了一些弯路。二是引发了我对故障处理时的一些思考。 6月19日,下午5点左右。数据库出

[转帖]模拟enq: TX - row lock contention争用

https://www.modb.pro/db/623036 enq: TX - row lock contention它表示一个事务正在等待另一个事务释放被锁定的行。这种等待事件通常发生在并发访问数据库时,多个事务试图同时修改同一行数据时会发生行级锁争用。 以下是可能导致 “enq: TX - r

[转帖]等待事件 enq:TX - row lock contention分析与解决

6月30日,数据库发生了大量锁表。大概持续1小时,并且越锁越多。后来通过业务人员停掉程序,并kill掉会话后解决。 几天后再EM上查看CPU占用: CPU发生了明显等待。 主要是由于enq:TX - row lock contention等待事件造成。 等待事件—enq:TX - row lock

[转帖]记录一则enq: TX - row lock contention的分析过程

https://www.cnblogs.com/jyzhao/p/8628184.html 故障描述:与客户沟通,初步确认故障范围大概是在上午的8:30-10:30之间,反应故障现象是Tomcat的连接数满导致应用无法连接,数据库alert中无明显报错,需要协助排查原因。 1.导入包含故障时刻的数据

[转帖]ASH REPORT SHOWS “** Row Source Not Available **”

https://alphaoragroup.com/2022/04/06/ash-report-row-source-not-available/ Whenever in ASH report, there is a section called Top SQL with Top Row Sourc

[转帖]ORACLE等待事件:enq: TX - row lock contention

https://www.cnblogs.com/kerrycode/p/5887150.html enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件。enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO

[转帖]ORACLE等待事件:enq: TX - row lock contention

https://www.cnblogs.com/kerrycode/p/5887150.html enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件。enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO