基于日期列对比两张表的计数差异并排查不匹配项
解决两表日期分组计数不匹配并展示差值的问题
你当前的需求是:两张含日期列的表,按日期分组统计行数,找出计数不匹配的日期并展示差值。先看你的示例数据:
示例数据
表1
| Date | Count |
|---|---|
| Apr. 25 | 178048 |
| Apr. 24 | 36273 |
表2
| Date | Count |
|---|---|
| Apr. 25 | 178048 |
| Apr. 24 | 36073 |
期望结果
| Date | Count |
|---|---|
| Apr. 24 | 200 |
问题分析
你用MINUS+UNION ALL的方式只能筛选出「存在于某一张表但另一张没有的日期」或「日期存在但计数完全不同的行」,但无法直接计算两个表计数的差值,所以得不到期望的结果。
解决方案
可以用FULL JOIN关联两个表的分组统计结果,再计算差值并过滤出不匹配的日期:
SELECT COALESCE(t1.date, t2.date) AS Date, ABS(COALESCE(t1.cnt, 0) - COALESCE(t2.cnt, 0)) AS Count FROM (SELECT date, COUNT(*) AS cnt FROM table1 GROUP BY date) t1 FULL JOIN (SELECT date, COUNT(*) AS cnt FROM table2 GROUP BY date) t2 ON t1.date = t2.date WHERE COALESCE(t1.cnt, 0) != COALESCE(t2.cnt, 0) ORDER BY Date DESC;
代码说明
- 子查询分组统计:先分别统计两张表中每个日期的行数,得到
t1和t2两个临时结果集 - FULL JOIN关联:确保无论日期只在表1、只在表2还是两张表都有,都能被检索到
- COALESCE处理NULL:如果某日期只在一张表存在,另一张表的计数会被视为0,避免计算时出现NULL
- ABS取差值绝对值:如果你需要区分是表1计数多还是少,可以去掉
ABS(),直接用t1.cnt - t2.cnt,结果会呈现正负值 - WHERE过滤匹配项:只保留计数不相等的日期行
把这段SQL替换你原来的查询,就能得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Djinjarin
相关产品推荐
相关产品推荐

