为啥将 ROW_NUMBER 定义为窗口函数?
Posted
技术标签:
【中文标题】为啥将 ROW_NUMBER 定义为窗口函数?【英文标题】:Why ROW_NUMBER is defined as window function?为什么将 ROW_NUMBER 定义为窗口函数? 【发布时间】:2020-12-07 14:10:31 【问题描述】:我想更好地理解窗口函数的含义。定义说:
窗口函数对与当前行有某种关联的一组表行(窗口)执行计算
让我们考虑ROW_NUMBER()
(同样适用于RANK()
或DENSE_RANK()
)。该函数只是为一组有序的行分配一个数字。这似乎不符合上述定义:它不是对与当前行有某种关联的一组表行进行计算,而是对所有结果行进行计算。
谁能解释一下?
【问题讨论】:
窗口函数是使用over
关键字的任何函数。因此,row_number()
是一个窗口函数。
这似乎是您引用的 Postgres 文档,但您已标记 sql-server
您只使用ORDER BY
子句吗?你有没有注意到PARTITION BY
选项?
在 SQL-Server 中,您所指的窗口函数的子集称为 ranking function,由于它们“为分区中的每一行”返回一个值,因此它们也是窗口函数。
为什么“窗口”不能是“整张桌子”? (另请注意,ROW_NUMBER()
并不经常在整个表格中使用。它可以是并不意味着它不是窗口函数。)
【参考方案1】:
当然,排名函数满足该定义。
当不使用partition by
时,整个表格就是“表格行集”。
与当前行的关系是当前行相对于其他行的值。
它遵循定义。
【讨论】:
【参考方案2】:此函数将虚拟序列号添加到行。取决于 PARTITION BY 和 ORDER BY 窗口结果,这个序列可以多次重启 特定窗口的时间。我之所以提到“虚拟”,是因为行号仅在查询时存在,而不是物理查询。
【讨论】:
以上是关于为啥将 ROW_NUMBER 定义为窗口函数?的主要内容,如果未能解决你的问题,请参考以下文章
Hive row_number() 中的自定义排序,按窗口函数排序