比方說,我想我有一個表有以下的列和值:停止定製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就這個相當簡單的特殊情況而言,這還不夠公平。但對於更復雜的場景,這種技術相當有用:-)。 –