如何正确统计表格中每个日期对应的城市数量?
问题分析与解决办法
你的需求是统计每个日期对应的不同城市数量,但现有SQL得到异常结果,核心问题出在数据格式和处理逻辑上:
数据脏污导致统计失效
从你给出的样例数据能看到,City列格式明显不统一:
- 城市名后带冒号(比如
Paris:) - 冒号前后夹杂多余空格(比如
Lyon :)
这种情况下,就算用count(distinct city),数据库也会把Lyon :和Lyon:判定为不同城市;如果表中存在大量重复脏数据行,count(*)自然会跑出远超预期的数值。
修正后的SQL写法
先清洗City列格式,再做统计:
1. 基础清洗统计
直接在统计时清理城市名的冒号和前后空格:
SELECT Date, COUNT(DISTINCT TRIM(REPLACE(City, ':', ''))) AS city_count FROM your_table GROUP BY Date ORDER BY Date;
2. 处理日期含时间的情况
如果你的Date列实际是datetime类型(包含时分秒,导致同一日期被拆分成多个不同值),需要先提取纯日期部分:
SELECT DATE(Date) AS pure_date, COUNT(DISTINCT TRIM(REPLACE(City, ':', ''))) AS city_count FROM your_table GROUP BY DATE(Date) ORDER BY pure_date;
额外排查项
如果结果仍异常,检查两点:
- 表中是否有大量重复行(同一日期同一城市多次出现),
count(distinct ...)会自动去重,确保统计的是城市数量而非行数 - 确认City列无其他隐藏格式问题(比如大小写差异、特殊字符),可以单独执行
SELECT DISTINCT TRIM(REPLACE(City, ':', '')) FROM your_table查看清洗后的城市列表,确认是否有重复项
内容的提问来源于stack exchange,提问作者gran_profaci
相关产品推荐
相关产品推荐

