【问题标题】:How to Calculate Aggregated Product Function in SQL Server如何在 SQL Server 中计算聚合积函数
【发布时间】:2015-06-10 02:32:23
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 乘法列是如何计算的?
  • 您不应该在数据库中存储计算列。而是创建一个嵌套的 select 语句来为您计算值。

标签: sql sql-server sum aggregate-functions exp


【解决方案1】:

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

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

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

【讨论】:

  • @TommySayugo - 不,您可以在查询中多次引用 same 表。当你这样做时,你应该使用 aliases (t, t2) 来指明你指的是哪个表的实例。
【解决方案2】:

创建 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 版本)。

【讨论】:

    猜你喜欢
    • 2017-01-29
    • 2020-06-08
    • 2013-08-14
    • 1970-01-01
    • 2020-08-05
    • 2012-10-04
    • 2016-05-05
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多