写点什么

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

  • 2023-05-29
    广东
  • 本文字数:1010 字

    阅读完需:约 3 分钟

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

本文分享自华为云社区《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_rnFROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f sLEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_keyLEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_keyWHERE actual_arrv_period_id = 202109AND s.transp_demand_no='0FF7640001270MCHN01H';
复制代码


前后两次执行结果


1)第一次执行



2)第二次执行



问题定位分析方位为执行如下语句


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_rkFROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f sLEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_keyLEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_keyWHERE actual_arrv_period_id = 202109AND s.transp_demand_no='0FF7640001270MCHN01H';
复制代码


可以看出相同的开窗逻辑下 rank()值都 1,而且所有记录中 s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no(即 PARTITION BY 列 + ORDER BY 列)的值都是一样的



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

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
GaussDB(DWS)迁移实践丨row_number输出结果不一致_数据库_华为云开发者联盟_InfoQ写作社区