欢迎大家来到IT世界,在知识的湖畔探索吧!
本文分享自华为云社区《GaussDB(DWS)迁移 – oracle兼容 –row_number输出结果不一致-云社区-华为云》,作者:譡里个檔 。
【问题表现】
迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。
【问题分析】
这种问题大部分都是因为PARTITION BY 列 + ORDER BY 列组合起来不唯一,导致row_number()开窗函数结果集不稳定。
【解决方案】
如果不关注PARTITION BY 列 + ORDER BY 列组合值一样的记录的排序,那么可以使用函数rank()代替函数row_number(),二者的区别请戳这里;如果关注PARTITION BY 列 + ORDER BY 列组合值一样的记录的排序,那么需要增 ORDER BY 列,以保证同一个组内所有记录的唯一性。
【案例展示】
某客户反馈进行Orale迁移前,如下SQL结果集稳定;迁移后DWS运行结果和oracle不一致,且DWS本身运行结果不稳定
SELECT no_tax_ind_amt, row_number() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rn FROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f s LEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_key LEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_key WHERE actual_arrv_period_id = AND s.transp_demand_no='0FFMCHN01H' ;
欢迎大家来到IT世界,在知识的湖畔探索吧!
前后两次执行结果
1)第一次执行
2)第二次执行
问题定位分析方位为执行如下语句
欢迎大家来到IT世界,在知识的湖畔探索吧!SELECT no_tax_ind_amt, s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no, -- PARTITION BY 列 + ORDER BY 列 row_number() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rn, rank() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rk FROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f s LEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_key LEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_key WHERE actual_arrv_period_id = AND s.transp_demand_no='0FFMCHN01H' ;
可以看出相同的开窗逻辑下rank()值都1,而且所有记录中s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no(即PARTITION BY 列 + ORDER BY 列)的值都是一样的
关注#华为云开发者联盟# 点击下方,第一时间了解华为云新鲜技术~
华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/93101.html