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

如何按MeterNumber取Max(StartDate)记录并对比AccountNumber字段差异

实现方案

方案思路

  1. 第一步:使用窗口函数ROW_NUMBER()按AccountNumer、MeterNumber分组,组内按StartDate倒序排序,取每组排序第一的记录,即为每个水表号对应的最新(最大起始日期)记录。
  2. 第二步:在第一步的结果基础上,按AccountNumer分组,判断组内StartDate、EndDate、RateCode三个字段是否存在差异,只要有任意一个字段的值不唯一,就将该账户下的所有最新记录筛选出来。

完整SQL代码

WITH latest_meter_records AS (
    -- 第一步:获取每个MeterNumber对应最大StartDate的记录
    SELECT 
        ROW_NUMBER() OVER(ORDER BY AccountNumer, MeterNumber) AS RowNo,
        AccountNumer,
        MeterNumber,
        StartDate,
        EndDate,
        RateCode
    FROM (
        SELECT 
            AccountNumer,
            MeterNumber,
            StartDate,
            EndDate,
            RateCode,
            ROW_NUMBER() OVER(PARTITION BY AccountNumer, MeterNumber ORDER BY StartDate DESC) AS rn
        FROM Meter
        -- 如需指定AccountNumber,可在此处加WHERE条件:WHERE AccountNumer = '你要查询的账号'
    ) t
    WHERE rn = 1
),
account_diff_check AS (
    -- 第二步:校验同一Account下三个字段是否存在差异
    SELECT 
        *,
        COUNT(DISTINCT CONCAT(StartDate, '|', EndDate, '|', RateCode)) OVER(PARTITION BY AccountNumer) AS distinct_count
    FROM latest_meter_records
)
-- 最终输出存在差异的记录
SELECT RowNo, AccountNumer, MeterNumber, StartDate, EndDate, RateCode
FROM account_diff_check
WHERE distinct_count > 1
ORDER BY RowNo;

代码说明

  • 若仅需查询指定账号,可在第一层子查询的WHERE条件中添加账号过滤规则,降低计算开销。
  • 使用CONCAT拼接三个字段判重,避免多字段分别统计的复杂度,分隔符|可替换为不会出现在字段值中的任意特殊字符。
  • 该方案兼容所有支持窗口函数的主流数据库(MySQL 8.0+、SQL Server、PostgreSQL、Oracle等)。

内容的提问来源于stack exchange,提问作者tt0206

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 09:36:07