OVER子句中的SQL ORDER BY与CLR聚合不兼容
本文关键字:CLR 不兼容 BY ORDER 子句 SQL OVER | 更新日期: 2023-09-27 18:08:04
序言我一直在研究一个概念,我在下面发布的是我一直在尝试的精简版。如果你看着它,认为"这样做没有任何意义",那么这可能是因为我没有任何意义——可能有更有效的方法可以做到这一点。我只是想试试这个,因为它看起来很有趣。
我试图在SQL中使用CLR自定义聚合,使用类似反向波兰的实现来计算任意计算。我正在使用数据:
K | Amt | Instruction | Order
--+-----+-------------+------
A | 100 | Push | 1
A | 1 | Multiply | 2
A | 10 | Push | 3
A | 2 | Multiply | 4
A | | Add | 5
A | 1 | Push | 6
A | 3 | Multiply | 7
A | | Add | 8
计算结果应为123 ( = (100 * 1) + (10 * 2) + (1 * 3) )
。
使用以下SQL(以及我编写的CLR函数ReversePolishAggregate
和ToReversePolishArguments
*(,我可以得到正确的结果:
SELECT K
, dbo.ReversePolishAggregate(dbo.ToReversePolishArguments(Instruction, Amt))
FROM dbo.ReversePolishCalculation
GROUP BY K;
问题我想通过将指令和顺序放在一个单独的表中来进一步推广解决方案,这样我就可以对任意数据进行计算。例如,我想到了这样一张表:
Item | Type | Amount
-----+----------+-------
A | Budgeted | 10
A | Actual | 12
B | Actual | 20
B | Budgeted | 18
并将其连接到类似的计算表中
Type | Instruction | Order
---------+-------------+------
Budgeted | Push | 1
Actual | Minus | 2
计算每个项目是超出预算还是低于预算。重要的考虑因素是减是不可交换的,所以我需要指定顺序,以确保从预算金额中减去实际金额,而不是相反。我希望能够在聚合的OVER
子句中使用ORDER BY
子句来实现这一点(然后对结果进行一些调整(。
SELECT K
, dbo.[ReversePolishAggregate](
dbo.[ToReversePolishArguments](Instruction, Amt))
OVER (PARTITION BY K ORDER by [Order])
FROM dbo.ReversePolishCalculation;
然而,我得到了错误:
关键字"ORDER"附近的语法不正确。
我已经通过运行以下SQL语句检查了语法
SELECT K
, SUM(Amt) OVER (PARTITION BY K ORDER BY [Order])
FROM dbo.ReversePolishCalculation;
这很好(它解析并运行,尽管我不确定结果是否有意义(,所以我只能假设这是自定义CLR聚合或函数的问题。
我的问题这应该有效吗?是否有任何文档明确表示不支持此功能?我的语法正确吗?
我使用的是Visual Studio 2012高级版、SQL Server Management Studio 2012和.NET framework 4.0。
*我创建了两个CLR函数,以解决无法将多个参数传递到单个聚合函数中的问题——请参阅本文。
编辑:这篇文章看起来不受支持,但我希望有更官方的东西。
作为答案:
官方来自微软,编号
http://connect.microsoft.com/SQLServer/feedback/details/611026/add-support-for-over-order-by-for-clr-aggregate-functions
它似乎没有进入2014年(或2016年CTP 3(。。。没有提到许多transact-sql更改:
http://msdn.microsoft.com/en-us/library/bb510411.aspx#TSQL