比方说,我想我有一个表有以下的列和值:停止定制SQLCLR合计年初
| BucketID | Value |
|:-----------|------------:|
| 1 | 3 |
| 1 | 2 |
| 1 | 1 |
| 2 | 0 |
| 2 | 1 |
| 2 | 5 |
让我们假设我要分区超过BucketId和分区乘以值:
SELECT DISTINCT BucketId, MULT(Value) OVER (PARTITION BY BucketId)
现在,没有内建聚集MULT功能,所以我写我自己的使用SQL CLR:
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
[Serializable]
[SqlUserDefinedAggregate(Format.Native, Name = "MULT")]
public struct MULT
{
private int runningSum;
public void Init()
{
runningSum = 1;
}
public void Accumulate(SqlInt32 value)
{
runnningSum *= (int)value;
}
public void Merge(OverallStatus other)
{
runnningSum *= other.runningSum;
}
public SqlInt32 Terminate()
{
return new SqlInt32(runningSum);
}
}
我的问题归结为,让我们假设我在Accumulate
或Merge
中达到0,没有意义继续。如果是这样的话,我一打0就该如何返回0?
这将需要仔细测试,看看是否有任何意见。具体而言,插入条件语句将涉及额外的指令和(可能)分支,这些分支可能比仅仅无条件地相乘(取决于JIT编译器对它的做法)要慢。 –
@JeroenMostert就这个相当简单的特殊情况而言,这还不够公平。但对于更复杂的场景,这种技术相当有用:-)。 –