为啥将 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() 中的自定义排序,按窗口函数排序

使用 ROW_NUMBER() 窗口函数选择行

使用ROW_NUMBER()窗口功能选择行

前 MariaDB 版本中的 Row_Number() 窗口函数

MySQL5.7实现ROW_NUMBER窗口函数功能SQL

在sybase中重建窗口函数row_number