SQL Server - 使用 ROWS BETWEEN UNBOUNDED PRECEDING 的分区过度不起作用?

Posted

技术标签:

【中文标题】SQL Server - 使用 ROWS BETWEEN UNBOUNDED PRECEDING 的分区过度不起作用?【英文标题】:SQL Server - Over partition with ROWS BETWEEN UNBOUNDED PRECEDING not working? 【发布时间】:2018-09-19 01:29:05 【问题描述】:

根据documentation:

UNBOUNDED PRECEDING 适用于:SQL Server 2012 (11.x) 至 SQL 服务器 2017。

指定窗口从分区的第一行开始。 UNBOUNDED PRECEDING 只能指定为窗口起点。

那么,当使用这个时:

   avg(Qty) over (partition by [Name] 
    ORDER BY [Period] desc ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING)

我仍然得到滚动平均值。

我知道上述构造应该让我相当于Select TOP(3) avg(qty)...,至少根据文档。

我错过了什么吗?

【问题讨论】:

请发布一些示例数据和预期结果。请参阅How to Ask 和minimal reproducible example 了解更多详情。 您希望它给您TOP(3),但您已经明确表示“给我尽可能多的行”(又名UNBOUNDED)? @Damien_The_Unbeliever - 指定窗口从分区的第一行开始。 UNBOUNDED PRECEDING 只能指定为窗口起点。除非我以非常非常错误的方式解析它,否则引用并没有说明你所说的内容。 【参考方案1】:

在研究、测试和分析可用文档之后,要记住的一件事是我的理解是不完整的:在任何配置中使用 ROWS 时,参考点始终是当前行。所以我的查询:

avg(Qty) over (partition by [Name] 
    ORDER BY [Period] desc ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING)

仅表示“获取从窗口分区开始到当前行的所有行以及 2 行以上”。未说出口的部分是“当前行”,无论如何都存在。

感谢Damien_the_Unbeliever 说明了显而易见的事实,这让我一直在思考。

【讨论】:

以上是关于SQL Server - 使用 ROWS BETWEEN UNBOUNDED PRECEDING 的分区过度不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

获取 ROWS 作为 COLUMNS(SQL Server 动态 PIVOT 查询)

SQL Server 中是不是有等效的 SQL_CALC_FOUND_ROWS?

《Pro SQL Server Internals》之Data Pages Data Rows

SQL SERVER的统计信息

翻译:《Pro SQL Server Internals, 2nd edition》CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows

《Pro SQL Server Internals, 2nd edition》的CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows(翻