使用具有“order by”组件的窗口函数时,结果集的顺序是啥?

Posted

技术标签:

【中文标题】使用具有“order by”组件的窗口函数时,结果集的顺序是啥?【英文标题】:What is the result set ordering when using window functions that have `order by` components?使用具有“order by”组件的窗口函数时,结果集的顺序是什么? 【发布时间】:2012-02-06 21:48:50 【问题描述】:

我正在处理 SEDE 上的查询:

select top 20 
  row_number() over(order by "percentage approved" desc, approved desc), 
  row_number() over(order by "total edits" asc), 
  *
from editors 
where "total edits" > 30

考虑到两个窗口函数,结果集的顺序是什么?

我怀疑它未定义,但找不到明确的答案。 OTOH,根据over(order by ...) 子句对具有此类窗口函数的查询的结果进行排序。

【问题讨论】:

那些ORDER BY 是窗口函数的“内部”,并且用于确定窗口函数的值 - 它们没有任何影响在“外部”SELECT 上 - 他们确实以任何方式、形状或形式为整个 SELECT 指定 ORDER BY 不保证订单。但是,如果您想要特定的顺序,那么您在SELECT 语句can make a difference to efficiency. 中列出列的顺序 @marc_s 不是真的“它们没有效果”——请参阅 OP 以获取示例。 【参考方案1】:

结果可以按任何顺序返回。

现在,它们通常会按照OVER 子句中指定的顺序返回,但这仅仅是因为 SQL Server 可能会选择一个查询计划来对行进行排序以计算聚合。这绝不是保证,因为它可以随时选择不同的查询计划,尤其是当您使查询更加复杂时,这会扩展可能的查询计划的空间。

【讨论】:

【参考方案2】:

没有明确ORDER BYANY SQL Server 查询的结果集未定义。

这包括查询中有窗口函数,或子查询中有ORDER BY。结果顺序将取决于很多因素,除非您指定ORDER BY,否则这些因素都不能保证。

【讨论】:

以上是关于使用具有“order by”组件的窗口函数时,结果集的顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章

窗口函数 ROW_NUMBER() 使用变量 RUNNING TOTAL 更改处理 ORDER BY

FORMAT 函数超出了 RANGE 窗口框架的 ORDER BY 列表支持的大小(错误 8279)

无法在 Oracle 的窗口函数中使用 ORDER BY 子句

PostgreSQL 窗口函数:row_number() over (partition col order by col2)

MYSQL order by - NULL 值影响我的结果

没有 ORDER BY 的窗口函数