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

王柳  金牌会员 | 2023-5-29 18:11:41 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

摘要:迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。
本文分享自华为云社区《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本身运行结果不稳定
  1. SELECT
  2. no_tax_ind_amt,
  3. row_number() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rn
  4. FROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f s
  5. LEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_key
  6. LEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_key
  7. WHERE actual_arrv_period_id = 202109
  8. AND s.transp_demand_no='0FF7640001270MCHN01H'
  9. ;
复制代码
前后两次执行结果
1)第一次执行
2)第二次执行
问题定位分析方位为执行如下语句
  1. SELECT
  2. no_tax_ind_amt,
  3. s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no, -- PARTITION BY 列 + ORDER BY 列
  4. row_number() OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rn,
  5. rank()       OVER(PARTITION BY s.actual_arrv_period_id, s.transp_demand_no ORDER BY s.transp_demand_no DESC) pck_rk
  6. FROM fin_dwl_cbchnl.dwl_cbg_cst_tms_freigh_expen_f s
  7. LEFT JOIN dwrdim_dw1.dwr_dim_company_d c ON s.ship_company_key = c.company_key
  8. LEFT JOIN dwrdim_dw1.dwr_dim_supplier_d d ON s.supplier_key = d.supplier_key
  9. WHERE actual_arrv_period_id = 202109
  10. AND s.transp_demand_no='0FF7640001270MCHN01H'
  11. ;
复制代码
可以看出相同的开窗逻辑下rank()值都1,而且所有记录中s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no(即PARTITION BY 列 + ORDER BY 列)的值都是一样的
 
点击关注,第一时间了解华为云新鲜技术~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表