如何在SQL结果集中跳过重复值?Oracle ORA-00923报错排查
问题分析与SQL修正
错误原因
你的SQL触发ORA-00923: FROM keyword not found where expected错误,核心问题如下:
- 子查询结构混乱:将两个分组查询
R和D直接拼接在FROM后,同时在同一子查询中混合查询两个表字段并计算行号,导致Oracle无法正确解析FROM子句结构。 - 使用保留关键字做别名:
date是Oracle保留关键字,不能用作字段别名。 - 行号别名命名冲突:
ROW_NUMBER是窗口函数名称,用作别名易引发语法解析混淆。
修正后的SQL
SELECT formatted_loaded_date, stores, total_records_loaded FROM (SELECT To_char(Trunc(loaded_date), 'YYYY-MM-DD') AS formatted_loaded_date, Count(storenumber) AS stores, Sum(records_loaded) AS total_records_loaded, Row_number() OVER (PARTITION BY Sum(records_loaded), Count(storenumber) ORDER BY Trunc(loaded_date) DESC) AS rn FROM $a$ GROUP BY Trunc(loaded_date)) WHERE rn = 1 ORDER BY formatted_loaded_date DESC;
逻辑说明
- 合并分组计算:从原表
$a$按加载日期(截断到天)分组,一次性计算每日的加载记录总数和门店数量,避免多次子查询连接,提升执行效率。 - 窗口函数去重:通过
ROW_NUMBER()按total_records_loaded和stores的组合分区(仅当两个值同时重复时判定为需要去重的重复结果),按日期倒序排序,每个重复组合中最新的日期会被标记为rn=1。 - 筛选有效记录:外层查询只保留
rn=1的记录,自动跳过重复的旧日期统计结果,匹配你跳过重复值的需求。
内容的提问来源于stack exchange,提问作者Sarah Harrison
相关产品推荐
相关产品推荐

