Teradata中GROUP BY后WHERE子句的执行逻辑问询
Teradata中GROUP BY后WHERE子句的执行逻辑解析
先看你提到的Teradata查询代码:
SELECT ID , MIN(In_Time) as In_Time , MAX(Out_Time) as Out_Time FROM table GROUP BY 1 WHERE In_Time IS NOT NULL AND Out_Time IS NOT NULL
核心结论
这个WHERE子句过滤的是聚合前的原始In_Time、Out_Time列,不是聚合后的MIN/MAX结果。
执行逻辑解析
语法扩展不改变执行顺序:
标准SQL要求WHERE必须写在GROUP BY之前,但Teradata允许调整这个语法顺序,不过底层执行逻辑依然遵循SQL的经典流程:先过滤行,再做分组聚合。WHERE的执行阶段早于聚合:
SQL的逻辑执行顺序是:FROM→WHERE→GROUP BY→聚合函数计算→SELECT。所以这个查询里,WHERE会先把原始表中In_Time或Out_Time为NULL的行全部过滤掉,之后才会按照ID分组,再计算每个分组的MIN(In_Time)和MAX(Out_Time)。关于别名的说明:
虽然Teradata支持在WHERE中引用别名,但在这个场景下,SELECT里的In_Time是聚合后的别名,而WHERE执行时聚合还没发生,所以这里的In_Time和Out_Time只能匹配原始表的列,不可能引用到聚合后的结果。
等价的标准SQL写法
把WHERE移到GROUP BY之前,逻辑完全一致,这也是标准SQL的规范写法:
SELECT ID , MIN(In_Time) as In_Time , MAX(Out_Time) as Out_Time FROM table WHERE In_Time IS NOT NULL AND Out_Time IS NOT NULL GROUP BY 1
内容的提问来源于stack exchange,提问作者Taylor Womack
相关产品推荐
相关产品推荐

