使用具有“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 BY
的ANY 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)