【发布时间】:2013-07-08 12:12:56
【问题描述】:
我已将用户定义的聚合添加到我的数据库中,用于计算组的乘积。
代码基本上是从here逐字提取的。
我正在使用该函数来计算我拥有每月回报数据的金融工具的生命周期至今回报。该表如下所示:
----------------------------------------------------------
| InstrumentId(int) | MonthEnd(datetime) | Return(float) |
----------------------------------------------------------
我的查询如下所示:
SELECT R1.InstrumentId,
R1.MonthEnd,
R1.MonthlyReturn,
dbo.Product(1 + R2.MonthlyReturn) AS TotalReturn
FROM Returns R1
INNER JOIN Returns R2 ON R2.InstrumentId = R1.InstrumentId
AND R2.MonthEnd <= R1.MonthEnd
WHERE R1.InstrumentId BETWEEN 1 AND 50
GROUP BY R1.InstrumentId, R1.MonthEnd, R1.MonthlyReturn
ORDER BY R1.InstrumentId, R1.MonthEnd
当我只有几个仪器时,查询工作正常,但添加某些仪器会导致每个结果都为 NULL。当我使用 OPTION(MAXDOP 1) 执行查询时,结果很好。
有人知道是什么原因造成的吗?
编辑: 忘了提到我正在运行 SQL Server 2012 并且聚合目标是 .NET 4.5
【问题讨论】:
-
“基本上逐字逐句”可以隐藏许多罪恶——你能详细说明存在差异的地方吗?
-
@Damien_The_Unbeliever 我一直在使用 EXP(SUM(LOG(...))) 来计算产品,它忽略了空值,所以我也将产品更改为忽略空值。我也尝试了没有更改的代码,但仍然导致相同的错误。
-
您如何将其更改为忽略空值?您是刚刚更改了
IsInvariantToNulls还是在Accumulate内部进行了更改?
标签: sql-server aggregate-functions sqlclr