Oracle SQL转Databricks SQL Unity Catalog:标量子查询连接改写
正确的Databricks SQL转换方案
方法1:CTE + 窗口函数实现
先通过CTE给RtxnStatHist表按AcctNbr+RtxnNbr分组,对TIMEUNIQUEEXTN降序排序,筛选出每组中最大时间的记录,再和主表关联:
WITH ranked_rtxn AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY AcctNbr, RtxnNbr ORDER BY TIMEUNIQUEEXTN DESC) AS rn FROM `uc-dev`.iccu_dna.RtxnStatHist ) SELECT t.*, r.* FROM 你的主表名 t JOIN ranked_rtxn r ON t.AcctNbr = r.AcctNbr AND t.RtxnNbr = r.RtxnNbr WHERE r.rn = 1;
方法2:子查询替代CTE
如果不习惯CTE,直接用子查询也能实现相同逻辑:
SELECT t.*, r.* FROM 你的主表名 t JOIN ( SELECT *, ROW_NUMBER() OVER (PARTITION BY AcctNbr, RtxnNbr ORDER BY TIMEUNIQUEEXTN DESC) AS rn FROM `uc-dev`.iccu_dna.RtxnStatHist ) r ON t.AcctNbr = r.AcctNbr AND t.RtxnNbr = r.RtxnNbr WHERE r.rn = 1;
关键说明
- 若
AcctNbr+RtxnNbr+TIMEUNIQUEEXTN存在重复的最大值记录,想保留所有匹配项,可将ROW_NUMBER()替换为RANK()或DENSE_RANK() - 记得把代码中的
你的主表名替换成实际要关联的表名 - 这种写法完全适配Databricks SQL语法,规避了标量子查询作为连接条件的限制
内容的提问来源于stack exchange,提问作者Brett
相关产品推荐
相关产品推荐

