1

我有一个有 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

我怎样才能做到这一点?

4

2 回答 2

3

哦,这很痛苦。大多数数据库不支持product聚合函数。你可以用日志和权力来模拟它。所以,这样的事情可能会起作用:

select t.*,
       (select exp(sum(log(serial)))
        from table t2
        where t2.no <= t.no
       ) as cumeProduct
from table t;

请注意,log()可能会ln()在某些数据库中调用。此外,这适用于数。处理负数和零有多种变化,但这会使答案复杂化(并且样本数据都是正数)。

于 2015-06-10T02:36:12.590 回答
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 版本)。

于 2015-06-10T13:02:55.490 回答