我有以下从排序分区上的聚合生成的虚拟列,
MIN(picture_id) OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC )
但是,当我执行该操作时,我得到以下信息。
Msg 11305, Level 15, State 10, Line 12
The Parallel Data Warehouse (PDW) features are not enabled.
这是它变得有趣的地方,但没有分区上的排序顺序,它可以工作:
MIN(picture_id) OVER ( PARTITION BY [360_set] )
此外,ROW_NUMBER()
窗口函数(不是聚合函数)在分区上以明确的顺序工作。
ROW_NUMBER() OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC )
为什么所需的语句不起作用?这是在哪里记录的?请求版本信息,这是我在帮助→关于。
Microsoft SQL Server Management Studio 10.0.5512.0
Microsoft Analysis Services Client Tools 10.0.5500.0
Microsoft Data Access Components (MDAC) 6.1.7601.17514
Microsoft MSXML 3.0 6.0
Microsoft Internet Explorer 9.10.9200.16635
Microsoft .NET Framework 2.0.50727.5472
Operating System 6.1.7601
结果SELECT @@VERSION
是Microsoft SQL Server 2008 (SP3) - 10.0.5512.0 (X64) Aug 22 2012 19:25:47 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM)
这是一个仅存在于 SQL Server 2008 中的解析器错误。2012 年之前的非 PDW 版本的 SQL Server不支持
ORDER BY
具有聚合函数的子句,例如MIN
:与从 SQL Server 2005 开始可用的基本实现相比,窗口功能支持在 2012 年得到了显着扩展。这些扩展在合并到盒装产品之前已在 Parallel Data Warehouse 中提供。因为各种版本共享一个共同的代码库,所以可能会出现这样的误导性错误消息。
如果您有兴趣,解析器验证聚合时的调用堆栈如下所示。因为聚合有一个
OVER
带有 的子句ORDER BY
,所以会发出一个 PDW 检查:此检查立即失败并出现解析器错误:
幸运的是,您不需要支持
ORDER BY
框架的窗口聚合来解决您的代码问题。这将是 PDW、Azure 和盒子版本的代码库合并的结果。在尝试执行仅在 Azure 中发布的内容时,我们将开始看到这样的消息,或者您不在 Azure 计算机上。
至于 Martin 关于 PDW 扩展是什么的问题,这些将是 T-SQL 语言的特性,仅在并行数据仓库 (PDW) 产品中实现。
将此作为错误消息的一个元素进行回答。正如@MartinSmith 上面所说,
这里正式提到了SQL Server 2008 R2 - OVER Clause (Transact-SQL)
更重要的是SQL Server 2012 中的措辞 - OVER 子句 (Transact-SQL)
因此,看起来它在 2008 年肯定不可用 - 尽管该错误消息是一种非常模糊的说法“未实施”,而在 2012 年,微软的官方立场似乎是你的里程可能会有所不同。