You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

电力供应商数据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:21:31