Menu
CoddyTech

ROWS 和 RANGE 条件

Coddy 高级 SQL 课程的第 12 课,共 13 课。

目前,我们无法灵活地选择要考虑前后多少行。现在可以通过 ROWS 和 RANGE 条件来实现。要使用它们,我们这样写:

OVER (ROWS BETWEEN --START-- AND --END--)

OVER (RANGE BETWEEN --START-- AND --END--)

我们可以指定以下选项:

  • CURRENT ROW:当前行
  • n PRECEDING:当前行之前的行
  • n FOLLOWING:当前行之后的行 

ROWS 和 RANGE 的区别在于,ROWS 条件不考虑值,只考虑位置;而 RANGE 根据值的范围定义窗口,而不是根据行的位置定义。

对于 RANGE,我们必须指定 ORDER BY --column_name--,否则系统就不知道如何选择窗口。

例如:

ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING

这里创建的窗口包含当前行、它的前一行和后一行。

 

RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levels

这里创建的窗口会为每个级别(按升序排列)包含当前级别、它的前一个级别和后一个级别。如果当前级别是 5,那么窗口会包含级别 4、5 和 6。

注意:使用 RANGE BETWEEN 可能会导致窗口包含更多行,因为它会包含范围内值相同的所有行;而 ROWS BETWEEN 始终会包含相同数量的行(只要数据集中有足够的行)。 

此外,RANGE 不支持日期列。

challenge icon

挑战

简单

在这个挑战中,我们有报纸的生产数据。我们想知道当前行前两天和后一天印刷的报纸数量的平均值。此外,我们还想知道从当前日期到此前三天内印刷的报纸数量的最大值与最小值之差。请将这两列分别命名为 avg_newspapers 和 diff_newspapers。

亲手试试

高级 SQL中的所有课

自己练习: Python 在线编译器