窗口函数(Window Functions)中的Window子句用于指定计算的范围,即函数对哪些行进行操作。其默认范围取决于是否同时使用了PARTITION BY
和ORDER BY
子句。
-
当只有
ORDER BY
子句,没有PARTITION BY
和Window
子句时:- 默认的Window范围是从整个结果集的第一行到当前行,即
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
。
- 默认的Window范围是从整个结果集的第一行到当前行,即
-
当使用
PARTITION BY
子句但没有明确指定Window
子句时:- Window函数会在每个由
PARTITION BY
定义的分区内独立运行。 - 对于每个分区,如果没有明确指定
Window
子句且只有ORDER BY
,则默认的Window范围仍然是从该分区的第一行到当前行。
- Window函数会在每个由
-
当没有
ORDER BY
和Window
子句时:- 如果Window函数没有
ORDER BY
子句(无论是否有PARTITION BY
),并且没有明确指定Window
子句,那么Window的范围默认是整个分区(如果有PARTITION BY
)或整个结果集(如果没有PARTITION BY
)。但请注意,这种情况下,某些窗口函数(如LEAD
和LAG
)可能无法正常工作,因为它们需要明确的顺序来确定“前一行”或“后一行”。
- 如果Window函数没有
-
Window子句的具体形式:
- Window子句可以明确指定范围,如
(ROWS | RANGE) BETWEEN ... AND ...
。其中ROWS
表示按物理行数计算,而RANGE
则可能基于某些字段值的范围来计算。 - 常见的范围选项有:
UNBOUNDED PRECEDING
:从分区的开始到当前行N PRECEDING
:从当前行往前数N行CURRENT ROW
:当前行N FOLLOWING
:从当前行往后数N行UNBOUNDED FOLLOWING
:从当前行到分区的结束
- Window子句可以明确指定范围,如
结合上述信息,可以总结出窗口函数Window子句的默认范围通常是从分区的开始到当前行(如果使用了PARTITION BY
和ORDER BY
),或者整个分区/结果集(如果没有ORDER BY
且没有明确指定Window子句)。但在实际使用中,为了明确和精确控制计算范围,通常会显式指定Window子句。