last_value() 使用 RANGE 的 sql 窗口函数

问题描述 投票:0回答:1

我正在下面运行这个 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
  • 然而,事实并非如此,因为它仍然是
  • Jose Manuel Urman
  • 这也发生在所有其他
  • range (range1, range2, range3
    ) 列上。
有人可以解释为什么会发生这种情况吗?如果我使用

row

 效果很好,但使用 
range
 则不行。

sql window-functions
1个回答
0
投票
只需将窗口从“范围”更改为“行”...

ROWS 子句确实做到了这一点。它指定当前行之前或之后的固定行数,无论其值如何。这些行用于窗口函数。

另一方面,

RANGE子句在逻辑上限制了行。这意味着它根据与当前行相比的值来考虑行。

© www.soinside.com 2019 - 2024. All rights reserved.