首页 > 其他分享 >row_number函数的不稳定性

row_number函数的不稳定性

时间:2023-09-05 16:33:35浏览次数:35  
标签:十一 13 name 张三 number 不稳定性 张四 row

本文分享自华为云社区《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

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

 

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

 

标签:十一,13,name,张三,number,不稳定性,张四,row
From: https://www.cnblogs.com/huaweiyun/p/17680032.html

相关文章

  • 让我感觉很爽的CachedRowSet
    作者:fbysss问题:在DBmanager.java中写了一个getResultSet方法,为的就是不用每次在页面中去释放连接。然而,在不同的操作系统环境下,不一定好使,比如在windows下,ResultSet是可以脱离connection继续使用的,但linux下就不行。如果要修改为Collection所有的页面都要进行修改,其改动量可想而知,......
  • 泛微E-cology9 browser.jsp SQL注入漏洞QVD-2023-5012
    漏洞简介泛微e-cology9存在SQL注入漏洞,攻击者可利用该漏洞获取数据库敏感信息。影响版本泛微e-cologyV9<10.56漏洞复现fofa语法:app="泛微-协同商务系统"登录页面:POC:POST/mobile/%20/plugin/browser.jspHTTP/1.1Host:115.236.39.115:8088User-Agent:Mozilla/5.0(W......
  • SQL备忘-基本控制语句复习及@@ROWCOUNT陷阱纪实
    作者fbysss关键字:SQL语句      好久不写复杂的sql语句,以至于很多东西都忘记。以至于写出@name="sss"来(应该使用单引号)还是写日志好,一些小的知识点很快可以查到,所以有机会就赶紧贴上来,顺便给需要的人参考。下面这段很简单,但是很容易陷入@@rowcount的“想当然”陷阱。declare......
  • AGC057E RowCol/ColRow Sort【性质,DP】
    给定一个\(n\timesm\),值域\([0,9]\)的矩阵\(B\),计数有多少个大小相同的矩阵\(A\)满足下列条件:分别对\(A\)的每一列中元素从小到大排序,再分别对\(A\)的每一行中元素从小到大排序能够得到\(B\)。分别对\(A\)的每一行中元素从小到大排序,再分别对\(A\)的每一列中......
  • number
    NumberNumber对象是经过封装的能让你处理数字值的对象。#实例方法#toFixed(fractionDigits?)使用定点表示法来格式化一个数值。参数参数名参数类型是否必填描述fractionDigitsnumber否小数点后数字的个数;介于0到20(包括)之间,实现环境可能支持更大范围。如果......
  • vue --version 运行出现throw new ERR_SYSTEM_ERROR 错误
    (1)根据错误提示信息,找到出错入口文件:E:\SVN\zlpt\node_modules\node-ipc\entities\Defaults.js然后指定位置添加如下代码即可:constos=require('os');os.hostname=()=>"localhost";......
  • 连接redis后 ,报错: ERR wrong number of arguments for ‘hset‘ command“怎么解决
    原因:ERRwrongnumberofargumentsfor‘hset‘command触发代码 解决方法:可能是java不匹配我本地3.2版本的redis,我换一个更大版本的redis就解决了 ......
  • bad version number in .class file
    用eclipse3.3进行编译的时候出现了badversionnumberin.classfile错误。原来我用的是1.5的JDK,但是eclipse默认的编译用的是6.0级别。设置一下就可以了。java->compiler->JDKcompliance修改一下compilercompliancelevel就可以了......
  • 20230512 java.lang.Throwable
    介绍java.lang.ThrowablepublicclassThrowableimplementsSerializableError和Exception的父类,只有该类型才可以被throw和catch不是RuntimeException或Error子类的都被认为是检查异常(checkedexception),包括Throwable构造函数共有5个构造函数,继承时可以选择性......
  • CF1423K Lonely Numbers
    思路因为对于\(\gcd(a,b)\),\(\fraca{\gcd(a,b)}\),\(\fracb{\gcd(a,b)}\)中\(a\)和\(b\)是等价的,可以交换的。所以我们先令\(a>b\)。令\(\gcd(a,b)=d\),因为\(\fraca{\gcd(a,b)}\)有除法,所以我们应该想办法去除除法,就同乘以一个\(d\),即\(d^2\),\(a\),\(b\)三条边。......