Допустим, я хочу, чтобы у меня была таблица со следующими столбцами и значениями:
| BucketID | Value |
|:-----------|------------:|
| 1 | 3 |
| 1 | 2 |
| 1 | 1 |
| 2 | 0 |
| 2 | 1 |
| 2 | 5 |
Давайте представим, что я хочу разделить BucketId и умножить значения в разделе:
SELECT DISTINCT BucketId, MULT(Value) OVER (PARTITION BY BucketId)
Теперь нет встроенной функции Aggregate 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);
}
}
Мой вопрос сводится к следующему: предположим, я набрал 0 в Accumulate или Merge, нет смысла продолжать. Если это так, как я могу вернуть 0, как только я нажму 0?