基于pick_date列统计源表与目标表的缺失记录数
基于pick_date列统计源表与目标表的缺失记录数
看起来你需要按日期统计目标表相对于源表缺失的记录数量,也就是每个日期下源表记录数减去目标表记录数的差值(只保留有缺失的日期)。我来帮你梳理解决方案:
首先先明确你的表结构和现有数据:
表结构
create table source_table(sno number,pick_date date); create table target_table(sno number,pick_Date date);
现有数据
源表(source_table)数据:
| sno | pick_date |
|---|---|
| 1 | 12-JAN-23 |
| 3 | 13-JAN-23 |
| 5 | 14-JAN-23 |
| 6 | 14-JAN-23 |
| 7 | 14-Jan-23 |
| 2 | 13-JAN-23 |
目标表(target_table)数据:
| Sno | Pick_date |
|---|---|
| 1 | 12-JAN-23 |
| 2 | 13-JAN-23 |
| 5 | 14-JAN-23 |
解决方案SQL
你可以通过统计两个表各日期的记录数,再计算差值来得到结果。这里用CTE(公共表表达式)让逻辑更清晰:
WITH source_counts AS ( -- 统计源表每个日期的记录数 SELECT pick_date, COUNT(*) AS source_cnt FROM source_table GROUP BY pick_date ), target_counts AS ( -- 统计目标表每个日期的记录数 SELECT pick_date, COUNT(*) AS target_cnt FROM target_table GROUP BY pick_date ) SELECT -- 格式化日期为你需要的格式 TO_CHAR(sc.pick_date, 'DD-MON-RR') AS Pick_date, -- 计算缺失数:源表数 - 目标表数(目标表无此日期则按0算) (sc.source_cnt - NVL(tc.target_cnt, 0)) AS Count FROM source_counts sc -- 左连接确保源表的所有日期都被包含 LEFT JOIN target_counts tc ON sc.pick_date = tc.pick_date -- 只保留有缺失的日期 WHERE (sc.source_cnt - NVL(tc.target_cnt, 0)) > 0 ORDER BY sc.pick_date;
结果说明
执行上面的SQL后,会得到你期望的结果:
| Pick_date | Count |
|---|---|
| 13-JAN-23 | 1 |
| 14-JAN-23 | 2 |
这里的逻辑是:
- 先分别统计两个表每个日期的总记录数
- 用左连接关联两个统计结果,确保源表的所有日期都不会被遗漏
- 用
NVL函数处理目标表中不存在的日期(此时目标计数为0),避免出现空值 - 计算差值并筛选出差值大于0的行,就是该日期下目标表缺失的记录数
备注:内容来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

