摘要:遷移前後結果集row_number欄位值前後不一致,前在DWS上運行不一致。 本文分享自華為雲社區《GaussDB(DWS)遷移 - oracle相容 --row_number輸出結果不一致》,作者:譡里個檔 。 【問題表現】 遷移前後結果集row_number欄位值前後不一致,前在DWS上運 ...
摘要:遷移前後結果集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 列)的值都是一樣的