ROWS 和 RANGE 条件
本课属于 Coddy SQL 学习旅程的“基础知识”单元。第 69 课,共 72 课。
目前,我们无法灵活选择要考虑前后多少行。现在可以使用 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这里会创建一个窗口,其中包含当前行、前一行和后一行。
ORDER BY levels
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING这里会为每个级别创建一个窗口(按升序排列),其中包含当前级别、前一个级别和后一个级别。如果当前级别是 5,那么窗口将包含级别 4、5 和 6。
注意:使用 RANGE BETWEEN 可能会在窗口中包含更多行,因为它会包含范围内值相同的所有行;而 ROWS BETWEEN 始终会包含相同数量的行(只要数据集中有足够的行)。
另外,对于以文本形式存储的日期(例如 '2024-01-05'),RANGE 偏移不会进行日期运算:使用 1 PRECEDING 时,窗口中只包含日期相同的行。要按天数计数,请改为按数字排序,例如 julianday(date)。
下面是一个简单的示例,用来说明 ROWS 和 RANGE 的区别:
使用 ROWS:
SELECT employee_name, salary,
AVG(salary) OVER (
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) as avg_salary_rows使用 RANGE:
SELECT employee_name, salary,
AVG(salary) OVER (
ORDER BY salary
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
) as avg_salary_range挑战
简单可用的表和列:
newspapers:date,num_newspapers
在这个挑战中,我们有报纸的生产数据。我们想知道当前行前两天和后一天印刷的报纸平均数量。此外,我们还想知道从当前日期到前三天印刷的报纸数量中,最大值和最小值的差。分别将这些列命名为 avg_newspapers 和 diff_newspapers。
亲手试试
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: SQL 在线编辑器