前言 我一直在研究一个概念,我在下面发布的是我一直在尝试的内容的简化版本。如果您看着它并认为“那样做没有任何意义”,那可能是因为我没有任何意义 - 可能有更有效的方法来做到这一点。我只是想尝试一下,因为它看起来很有趣。
我正在尝试使用类似逆波兰式的实现在 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;
但是我得到了错误:
Incorrect syntax near the keyword 'ORDER'.
我已经通过运行以下 SQL 语句检查了语法
SELECT K
, SUM(Amt) OVER (PARTITION BY K ORDER BY [Order])
FROM dbo.ReversePolishCalculation;
这工作正常(它解析并运行,尽管我不确定结果是否有意义),所以我假设这是自定义 CLR 聚合或函数的问题。
我的问题 这应该有效吗?是否有任何文档明确说明不支持此功能?我的语法正确吗?
我使用的是 Visual Studio 2012 Premium、SQL Server Management Studio 2012 和 .NET Framework 4.0。
* 我创建了 2 个 CLR 函数作为无法将多个参数传递到单个聚合函数的变通方法 - 参见 this article .
编辑:This post看起来它不受支持,但我希望有一些更官方的东西。
最佳答案
作为回答:
微软官方,没有。
它似乎没有进入 2014(或 2016 CTP 3)......没有提到许多 transact-sql 更改:
关于c# - OVER 子句中的 SQL ORDER BY 与 CLR 聚合不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24165879/