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

如何用OVER..PARTITION BY按UNIT_CODE获取唯一的最大BUSINESS_DAY

问题分析与解决方案

首先得捋清楚两种写法结果差异的核心原因:

  • GROUP BY属于聚合查询,它会把同一个UNIT_CODE的所有行合并成一行,只返回该分组的聚合结果(这里就是对应分组最大的BUSINESS_DAY),所以你会得到2行结果。
  • 而MAX() OVER (PARTITION BY UNIT_CODE)是窗口函数,它不会减少原表的行数,只是给每一行计算出其所在UNIT_CODE分组的最大BUSINESS_DAY值。你的原表有4条符合GROUP_NAME='ANG'的记录(2条HK、2条IN),自然会返回4条重复的最大值。

要让窗口函数的查询结果和GROUP BY一致,有两种简洁的解决方式:

方式1:添加DISTINCT去重

因为同一个UNIT_CODE分组的最大值是完全相同的,直接用DISTINCT去掉重复行就能得到预期的2行结果:

SELECT DISTINCT MAX(BUSINESS_DAY) OVER (PARTITION BY UNIT_CODE) AS RUN_DATE
FROM CALENDAR_ORG
WHERE GROUP_NAME='ANG';

方式2:用ROW_NUMBER筛选分组唯一行

如果后续需要保留更多原表字段、做更灵活的逻辑控制,可以用子查询结合ROW_NUMBER()窗口函数,只取每个分组的第一行:

SELECT RUN_DATE
FROM (
    SELECT 
        MAX(BUSINESS_DAY) OVER (PARTITION BY UNIT_CODE) AS RUN_DATE,
        ROW_NUMBER() OVER (PARTITION BY UNIT_CODE ORDER BY BUSINESS_DAY DESC) AS rn
    FROM CALENDAR_ORG
    WHERE GROUP_NAME='ANG'
) sub_query
WHERE rn = 1;

其实如果你的需求仅仅是获取每个UNIT_CODE的最大BUSINESS_DAY,你最初的GROUP BY写法已经足够高效简洁。窗口函数更适合需要保留原表所有行,同时附加分组聚合信息的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:22:52