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

2023-06-0817:26:46数据库教程Comments673 views字数 1469阅读模式

【问题表现】

迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

【问题分析】

这种问题大部分都是因为PARTITION BY 列 + ORDER BY 列组合起来不唯一,导致row_number()开窗函数结果集不稳定。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

【解决方案】

如果不关注PARTITION BY 列 + ORDER BY 列组合值一样的记录的排序,那么可以使用函数rank()代替函数row_number(),二者的区别请戳这里;如果关注PARTITION BY 列 + ORDER BY 列组合值一样的记录的排序,那么需要增 ORDER BY 列,以保证同一个组内所有记录的唯一性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

【案例展示】

某客户反馈进行Orale迁移前,如下SQL结果集稳定;迁移后DWS运行结果和oracle不一致,且DWS本身运行结果不稳定文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

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 = 202109
AND s.transp_demand_no='0FF7640001270MCHN01H'
;

前后两次执行结果文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

1)第一次执行文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

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

2)第二次执行文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

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

问题定位分析方位为执行如下语句文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

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 = 202109
AND s.transp_demand_no='0FF7640001270MCHN01H'
;

可以看出相同的开窗逻辑下rank()值都1,而且所有记录中s.actual_arrv_period_id, s.transp_demand_no, s.transp_demand_no(即PARTITION BY 列 + ORDER BY 列)的值都是一样的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html

GaussDB(DWS)迁移实践丨row_number输出结果不一致
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46074.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/46074.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定