我正在下面运行这个 sql 查询:
select e.first_name ,
e.last_name,
ed.department_name ,
e.salary,
last_value(concat(e.first_name, ' ', e.last_name)) over(partition by ed.department_name order by salary range between unbounded preceding and unbounded following) UnboundedCol,
last_value(concat(first_name, ' ', last_name)) over(partition by ed.department_name order by salary range between 0 preceding and 0 following) range0,
last_value(concat(first_name, ' ', last_name)) over(partition by ed.department_name order by salary range between 1 preceding and 1 following) range1,
last_value(concat(first_name, ' ', last_name)) over(partition by ed.department_name order by salary range between 2 preceding and 2 following) range2,
last_value(concat(first_name, ' ', last_name)) over(partition by ed.department_name order by salary range between 3 preceding and 3 following) range3
from employees e
join employee_departments ed on e.department_id = ed.department_id
order by ed.department_name, salary;
这是查询的输出:
我的问题是,例如,如果您关注department_name列中的值Finance,为什么列
range0, range1, range2, range3
的值会相同?
如果我以第 9 行 和 first_name
为例Jose Manuel:
range1
列,
last_value()
函数上定义的窗口范围为 1 个前导和 1 个后导,这意味着其上方 1 行和下方 1 行。
last_value()
,row 9
的
range1
的值应该是row 10的名字,即John Chen。
range1, range2, range3
) 列上。
row
效果很好,但使用
range
则不行。
ROWS 子句确实做到了这一点。它指定当前行之前或之后的固定行数,无论其值如何。这些行用于窗口函数。
另一方面,RANGE子句在逻辑上限制了行。这意味着它根据与当前行相比的值来考虑行。