如何用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
相关产品推荐
相关产品推荐

