我有一个包含2列的表:
No. Name Serial
1 Tom 1
2 Bob 5
3 Don 3
4 Jim 6
我想添加一个内容为多个串行列的列,如下所示:
No. Name Serial Multiply
1 Tom 2 2
2 Bob 5 10
3 Don 3 30
4 Jim 6 180
我该怎么做?
答案 0 :(得分:3)
哦,这是一种痛苦。大多数数据库不支持product
聚合函数。您可以使用日志和权限来模拟它。所以,这样的事情可能有用:
select t.*,
(select exp(sum(log(serial)))
from table t2
where t2.no <= t.no
) as cumeProduct
from table t;
请注意,log()
在某些数据库中可能被称为ln()
。此外,这适用于正数字。处理负数和零有变化,但这使得答案变得复杂(并且样本数据都是正数)。
答案 1 :(得分:1)
创建CLR聚合并不是那么糟糕。我在大约5分钟内把它掀起:
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)]
public struct Product
{
private SqlDouble _p;
public void Init()
{
this._p = new SqlDouble(1);
}
public void Accumulate(SqlDouble Value)
{
this._p *= Value;
}
public void Merge (Product Group)
{
this._p *= Group._p;
}
public SqlDouble Terminate ()
{
// Put your code here
return _p;
}
}
一旦你得到了它,你就可以使用通常用于运行总和的技术(即三角形连接或界定行的窗口定义,具体取决于你的sql版本)。