电力供应商数据SQL去重:保留唯一固定收费记录的问题
电力收费数据去重问题
我的数据来自电力供应商,收费分为固定收费和使用收费。目前在固定收费上遇到问题:计费周期内更换电表时,会生成两条固定收费记录,仅MeterID和合同编号不同,其余字段均一致。由于是月度固定收费,我希望仅保留其中一条记录。
已尝试的无效方法
我曾尝试通过创建视图来处理:
- 先创建不含
MeterID和合同编号的视图,提取唯一字段组合 - 再创建第二个视图,手动设置比真实值更小的
MeterUniqueNo(如A10000000,真实值示例为K18D01652)和MeterContractID(如100000,真实值示例为646802),试图通过数值比较删除重复项
编写了如下SQL语句,但因数值不匹配,执行后没有效果:
delete from main_table Inner join view2 on view2.MeterUniqueNo < main_table.MeterUniqueNo and view2.EnergyChargesRecord_InvoiceNumber = main_table.EnergyChargesRecord_InvoiceNumber and view2.EnergyChargesRecord_MPANNumber = main_table.EnergyChargesRecord.MPANNumber
另外也参考过单字段去重的方案,但我的场景需要同时校验MPAN号和发票号,无法直接套用。
可行的解决方案
推荐使用窗口函数ROW_NUMBER()标记重复项,再删除多余记录,具体操作如下:
1. 先验证重复标记结果
先执行查询,确认重复项标记正确:
SELECT *, ROW_NUMBER() OVER ( PARTITION BY EnergyChargesRecord_InvoiceNumber, EnergyChargesRecord_MPANNumber ORDER BY MeterUniqueNo DESC -- 可替换为MeterContractID,按需求保留最大/最小编号的记录 ) AS row_num FROM main_table WHERE 收费类型 = '固定收费' -- 仅针对固定收费,可根据实际情况调整
2. 删除重复记录
确认标记无误后,执行删除操作:
WITH DuplicateRecords AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY EnergyChargesRecord_InvoiceNumber, EnergyChargesRecord_MPANNumber ORDER BY MeterUniqueNo DESC ) AS row_num FROM main_table WHERE 收费类型 = '固定收费' ) DELETE FROM DuplicateRecords WHERE row_num > 1;
说明:
PARTITION BY后的字段是判断重复的核心标识(发票号+MPAN号),确保同一组内为重复的固定收费记录ORDER BY用来指定保留哪一条记录:比如MeterUniqueNo DESC会保留该组内电表编号最大的记录,ASC则保留最小的- 如果不需要过滤收费类型,可去掉
WHERE 收费类型 = '固定收费'条件
内容的提问来源于stack exchange,提问作者Derya Sahin
相关产品推荐
相关产品推荐

