Athena查询存在多个Meter Install Date的电表记录问题
解决电表多安装日期统计及服务点关联问题
先明确核心数据结构(假设你的核心表为customer_meter_data,字段包含customer_id、service_point_id、meter_id、meter_install_date),以下是分步解决方案:
1. 先清理重复行,生成可靠的基础数据集
重复行是导致统计结果不一致的核心原因之一,先通过去重得到唯一的【电表-安装日期】记录(如果是完全重复的冗余行,用DISTINCT即可;如果是同一电表同一安装日期有多条重复,用ROW_NUMBER()去重更严谨):
-- 生成去重后的临时数据集 WITH deduplicated_data AS ( SELECT customer_id, service_point_id, meter_id, meter_install_date, ROW_NUMBER() OVER (PARTITION BY meter_id, meter_install_date ORDER BY (SELECT NULL)) AS rn FROM customer_meter_data ) SELECT customer_id, service_point_id, meter_id, meter_install_date INTO #cleaned_meter_data FROM deduplicated_data WHERE rn = 1;
2. 统计存在多个安装日期的电表
基于清理后的数据集,精准找出所有拥有不同安装日期的电表,并关联对应的服务点和客户:
-- 统计每个电表的不同安装日期数量,筛选出数量>1的电表 WITH meter_install_counts AS ( SELECT meter_id, COUNT(DISTINCT meter_install_date) AS install_date_count, MAX(service_point_id) AS service_point_id, MAX(customer_id) AS customer_id FROM #cleaned_meter_data GROUP BY meter_id HAVING COUNT(DISTINCT meter_install_date) > 1 ) -- 最终结果:有多个安装日期的电表列表及所属关联信息 SELECT customer_id, service_point_id, meter_id, install_date_count FROM meter_install_counts;
3. 处理服务点含多电表且其一有多个安装日期的场景
如果需要统计存在至少一个多安装日期电表的服务点,或查看这类服务点下的所有电表状态,用以下SQL:
-- 先标记出有问题的电表 WITH problematic_meters AS ( SELECT meter_id FROM #cleaned_meter_data GROUP BY meter_id HAVING COUNT(DISTINCT meter_install_date) > 1 ) -- 找出包含这类电表的服务点,及该服务点下的所有电表信息 SELECT DISTINCT c.customer_id, c.service_point_id, c.meter_id, c.meter_install_date, CASE WHEN p.meter_id IS NOT NULL THEN '有多个安装日期' ELSE '正常' END AS meter_status FROM #cleaned_meter_data c LEFT JOIN problematic_meters p ON c.meter_id = p.meter_id WHERE p.meter_id IS NOT NULL; -- 若要查看所有服务点(含正常电表),去掉此条件
为什么之前的SQL结果不一致?
大概率是这几个原因:
- 未提前清理重复行,统计时把重复的安装日期误算成多个不同日期;
- 分组维度错误:比如按服务点分组时,误将多个电表的安装日期数量累加,而非针对单个电表统计;
- 混淆了
COUNT(*)和COUNT(DISTINCT meter_install_date),前者会把重复的安装日期也算入,导致结果偏大。
内容的提问来源于stack exchange,提问作者KWorkman
相关产品推荐
相关产品推荐

