MySQL中NTH_VALUE函数首行返回null的原因解析
为什么NTH_VALUE生成的列首行值为null?
核心原因:窗口框架的默认范围限制
你使用的NTH_VALUE(salary,2) OVER(ORDER BY salary ASC)语句中,默认的窗口框架范围是从结果集开头到当前行(RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),这是SQL中窗口函数仅指定ORDER BY时的默认行为。
- 对于结果的第一行(工资2800的Jenifer),当前窗口里只有这一行数据,不存在第2条记录,因此
NTH_VALUE无法找到目标值,返回null。 - 从第二行开始,窗口范围包含了前两行数据(2800和3000),此时第2个排序后的工资值就是3000;后续所有行的窗口范围都至少包含前两行,因此
NTH_VALUE始终返回3000。
让首行也显示目标值的方法
如果希望所有行都能获取到排序后的第2个工资值,可以显式指定窗口框架覆盖整个结果集:
SELECT first_name, last_name, role_, dept, salary, NTH_VALUE(salary,2) OVER(ORDER BY salary ASC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM emp_table;
调整后窗口会包含所有行的数据,首行也能直接找到排序后的第2个工资值3000。
内容的提问来源于stack exchange,提问作者user41968
相关产品推荐
相关产品推荐

