Oracle数据库中用中位数填充空值的简化实现方法咨询
简化Oracle SQL空值填充中位数的实现方式
你当前的写法不仅繁琐,还存在两处明显问题:一是临时表命名TEMP NULL非法(空格不允许,应为TEMP_NULL);二是UNION子查询里错误关联了TEMP_NOT_NULL,会导致数据重复。
完全不需要拆分多个临时表,用以下两种更简洁的方式就能实现需求:
方法1:子查询+NVL函数
直接通过子查询获取中位数,配合NVL函数替换空值:
CREATE TABLE NEW_TABLE AS SELECT PK_ID, NVL(COLUMN_NAME, (SELECT MEDIAN(COLUMN_NAME) FROM TABLE_ORIGIN)) AS COLUMN_NAME FROM TABLE_ORIGIN;
方法2:分析函数+NVL函数
利用Oracle的分析函数MEDIAN() OVER(),将中位数一次性广播到所有行,仅需扫描一次原表:
CREATE TABLE NEW_TABLE AS SELECT PK_ID, NVL(COLUMN_NAME, MEDIAN(COLUMN_NAME) OVER()) AS COLUMN_NAME FROM TABLE_ORIGIN;
两种方法都能直接生成目标表,其中方法2的执行效率通常更高,因为它只对原表做一次全表扫描,而方法1可能会扫描两次(取决于Oracle的优化器策略)。
内容的提问来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

