摘要:遷移前后結果集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本身運行結果不穩定
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' ;
前后兩次執行結果
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_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.uj5u.com/shujuku/553790.html
標籤:其他
下一篇:返回列表