获取字段全局MIN/MAX值时窗口函数失效问题排查
问题:SQL窗口函数无法获取全局MIN/MAX值的问题
我想要为所有行获取单个字段的MIN和MAX值,期望MIN(WEEK_P)始终为固定值20220917,MAX(DEWEDT)为20221008,但当前使用窗口函数未得到预期结果,以下是我的SQL代码:
SELECT FNL_DC AS 'DC', FNL_MC AS 'BUDGET_CHAIN', FNL_MODE AS 'MODE', FNL_WEEK, MIN( WEEK_P ) OVER ( PARTITION BY WEEK_P ORDER BY WEEK_P ) AS MIN_WEEK_P, /* 试图获取所有值的最小值(比如20220917)-- 现在得到的是20220924, 20221001, 20220917,NULL */ MAX( DEWEDT ) OVER ( PARTITION BY DEWEDT ORDER BY DEWEDT ) AS MAX_DEWEDT /* 试图获取所有值的最大值(比如20221008)-- 现在得到的是20221008, 20220917, NULL */ FROM table
问题分析与修正
错误原因
PARTITION BY WEEK_P/DEWEDT是核心问题:这个子句会把数据按照WEEK_P(或DEWEDT)的不同值拆分成独立分组,每个分组内计算MIN/MAX,结果自然就是分组自身的数值,而非全局的最小/最大值。- 多余的
ORDER BY:全局聚合不需要排序窗口,这个子句在这里毫无意义,反而会干扰计算逻辑。
修正后的SQL代码
SELECT FNL_DC AS 'DC', FNL_MC AS 'BUDGET_CHAIN', FNL_MODE AS 'MODE', FNL_WEEK, MIN(WEEK_P) OVER () AS MIN_WEEK_P, -- 去掉PARTITION BY,窗口覆盖全表,获取全局最小值 MAX(DEWEDT) OVER () AS MAX_DEWEDT -- 去掉PARTITION BY,窗口覆盖全表,获取全局最大值 FROM table
补充说明
MIN()和MAX()函数默认会忽略NULL值,所以无需额外处理NULL的情况。- 如果需要基于某些字段分组后再取组内的全局MIN/MAX,比如按
DC分组后取每个DC对应的全局WEEK_P最小值,才需要添加PARTITION BY DC,但你的需求是全局值,所以不需要任何分区。
内容的提问来源于stack exchange,提问作者Alyonaskii
相关产品推荐
相关产品推荐

