如何检测location_info表中地区与地点的跨月映射差异
需求与问题背景
需要排查location_info表中area_name与place_name的映射关系在不同月份(如2023-03与2023-04)是否发生变化,例如Kansas是否从RLT映射变为FLP映射。已知规则:
- RLT仅对应Kansas/Seattle
- FLP仅对应Orlando/Tulsa
现有表结构及2023-03的样本数据:
| area_name | place_name | set_report_date |
|---|---|---|
| RLT | Kansas | 2023-03 |
| RLT | Seattle | 2023-03 |
| FLP | Orlando | 2023-03 |
| FLP | Tulsa | 2023-03 |
此前尝试的SQL语句未能直接定位映射变化:
SELECT area_name, place_name, set_report_date FROM location_info where set_report_date in ('2023-03','2023-04') (select distinct area_name FROM location_info);
SELECT distinct place_name, area_name, set_report_date FROM location_info WHERE place_name IN (SELECT place_name FROM location_info WHERE area_name IN ('RLT',FLP') AND set_report_date in ('2023-03','2023-04'));
SELECT distinct place_name, area_name, set_report_date FROM location_info WHERE area_name IN ('RLT',FLP') AND set_report_date in ('2023-03','2023-04');
解决方案:跨月映射对比SQL
方案1:直接对比两个月的映射差异(含新增/删除场景)
该SQL会列出所有映射变更、新增映射、删除映射的情况,直观展示每个地点的跨月变化:
-- 找出2023-03存在、2023-04映射变化或消失的地点 SELECT t1.place_name, t1.area_name AS area_202303, t2.area_name AS area_202304 FROM location_info t1 LEFT JOIN location_info t2 ON t1.place_name = t2.place_name AND t2.set_report_date = '2023-04' WHERE t1.set_report_date = '2023-03' AND (t2.area_name IS NULL OR t2.area_name != t1.area_name) UNION ALL -- 找出2023-04新增、2023-03不存在的地点 SELECT t2.place_name, t1.area_name AS area_202303, t2.area_name AS area_202304 FROM location_info t2 LEFT JOIN location_info t1 ON t2.place_name = t1.place_name AND t1.set_report_date = '2023-03' WHERE t2.set_report_date = '2023-04' AND t1.area_name IS NULL;
方案2:按地点聚合映射历史,筛选有变化的记录
该SQL会将每个地点的跨月映射历史合并,仅展示存在变化的地点:
SELECT place_name, GROUP_CONCAT(DISTINCT CONCAT(set_report_date, ':', area_name) ORDER BY set_report_date) AS mapping_history FROM location_info WHERE set_report_date IN ('2023-03', '2023-04') AND area_name IN ('RLT', 'FLP') GROUP BY place_name HAVING COUNT(DISTINCT area_name) > 1 OR COUNT(DISTINCT set_report_date) > 1;
原SQL失效原因说明
- 第一个SQL存在语法错误,WHERE子句后多余的子查询未关联主查询,无法执行逻辑筛选
- 第二个SQL仅筛选出关联RLT/FLP的地点,但未做跨月映射对比,仅返回原始记录
- 第三个SQL仅列出两个月内RLT/FLP的所有记录,未对同一地点的跨月映射做对比,无法直接发现变化
内容的提问来源于stack exchange,提问作者me35quint
相关产品推荐
相关产品推荐

