如何按MeterNumber取Max(StartDate)记录并对比AccountNumber字段差异
实现方案
方案思路
- 第一步:使用窗口函数
ROW_NUMBER()按AccountNumer、MeterNumber分组,组内按StartDate倒序排序,取每组排序第一的记录,即为每个水表号对应的最新(最大起始日期)记录。 - 第二步:在第一步的结果基础上,按
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
相关产品推荐
相关产品推荐

