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
欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
安全攻防丨反序列化漏洞的实操演练
本文分享自《【安全攻防】深入浅出实战系列专题-反序列化漏洞》,作者:MDKing。 1. 基本概念 序列化:将内存对象转化为可以存储以及传输的二进制字节、xml、json、yaml等格式。 反序列化:将虚化列存储的二进制字节、xml、json、yaml等格式的信息重新还原转化为对象实例。 数据格式 序列化后的信息样例 二进制 xml json {"name":"tianyi","age":20} yaml !!com.huaweicloud.secure.Person {age: 20, name: tianyi}\n 序列化/反序列化库:如果想将对象序列化为二进制格式(或者反序列化回对象),直接使用JDK库自带的ObjectOutputStream的readObject、writeObject方法即可。如果想与其它格式(xml、json、yaml)相互转换,一般需要引入jackson、snakeyaml等其它开源组件,使用开源组件中提供的库方法。 库名称 序列化支持的格式 jdk 二进制、xml xstream xml、json jackson xml、json fastjson...
- 下一篇
数据库顶会 VLDB 2023 论文解读:字节跳动如何解决超大规模流式任务运维难题
本文解读了新加坡国立大学马天白教授团队、字节跳动基础架构-计算-流式计算团队联合发表在国际数据库与数据管理顶级会议 VLDB 2023 上的论文“StreamOps: Cloud-Native Runtime Management for Streaming Services in ByteDance”,介绍字节跳动内部基于数万 Flink 流式任务管理实践所提炼出的一个流式任务运行时管控解决方案,有效解决流式作业运行期间因流量和运行环境变化而暴露的各类运行时需要人工介入治理的问题,推动 NoOps 化核心能力。它支持管理超大规模的流式作业,提供包括自动扩缩容、慢节点自动迁移和延迟/故障智能诊断等能力,同时能插件化拓展功能。StreamOps 在字节跳动内部得到了大规模验证,日常节省 15% 计算资源,每天有效迁移慢节点约 1000 次,减少 75% 的人工 Oncall,大幅降低了超大规模场景下流式任务的维护成本。 论文链接:https://www.vldb.org/pvldb/vol16/p3501-mao.pdf。 引言 近年来,流计算被广泛应用于大规模的实时数据处理和决策中。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8