【问题标题】:Which approach is the best to calculate a running total [closed]哪种方法最适合计算运行总数[关闭]
【发布时间】:2014-02-26 07:07:46
【问题描述】:

今晚我一直在思考如何下注来解决运行总分的问题。我正在使用带有实体框架和 SQL Server 2012 的 C# 来开发一个可以分析我的银行交易的应用程序。

在数据库中,我创建了一个表Payment,其中包含以下属性:

PaymentDate, FromAccountId, ToAccountId, Amount

后一个属性Amount 始终为正值;事务的方向应由属性FromAccountIdToAccountId 确定。

现在,我必须能够在任何给定时间计算运行总数。例如,通过从月末减去月初的总和,我可以推断出特定帐户的余额。计算这个运行总计将在应用程序中发挥重要作用,因此单个计算不能花费太长时间。

我想出了 4 种策略来计算这个总和:

  1. 使用时间和帐户作为输入参数的存储过程。
  2. 在我的应用程序中计算运行总计(由于我使用的是实体框架,因此计算实际上会在数据库中进行)
  3. 创建一个表RunningTotal 并为每个事务更新它。这种方法的缺点是我必须自己保持这个表是最新的,即更多的业务逻辑。
  4. 与选项 3 类似,但随后使用基于付款表的视图。这样,我应该不得不处理额外的业务逻辑。

问题是,我无法确定哪种方法是最好的。你有什么想法?

【问题讨论】:

  • 所有这些选项都有利有弊。因此,这是一个见仁见智的问题,因此对于 Stack Overflow 来说是题外话。您尚未考虑的一个选项是选项 3 的变体,但使用数据库触发器来更新运行总计。这可能是我会使用的,但这一切都取决于......
  • 对于 SQL Server 2012,我会查看选项 #1 以便能够使用新的 LAGLEAD T-SQL 函数,这将允许你很容易计算运行总数。请参阅Intro to LAG and LEAD 了解说明
  • 请参阅thisthis,了解各种技术的性能比较,包括 SQL Server 2012 中引入的技术。
  • 感谢所有回复。由于我绝不是 t-sql 专家,因此您提供给我的有关 Sql Server 2012 功能的信息非常有帮助。

标签: c# sql architecture sql-server-2012


【解决方案1】:

在 SQL Server 2012(以及 Oracle 和 Postgres 以及 DB2 和 Teradata)中计算运行总计的最简单方法是使用累积和函数。这是一个基本示例:

select PaymentDate, FromAccountId, ToAccountId, Amount,
       sum(Amount) over (partition by FromAccountId, ToAccountId
                         order by PaymentDate
                        ) as cumAMount
from payments;

我怀疑您想要一些稍微不同的东西,将金额从--> 加到--> 从--减去到--> 从。你也可以这样做,但语法更复杂:

select PaymentDate, FromAccountId, ToAccountId, Amount,
       sum((case when FromAccountId < ToAccountId then Amount
                 else -Amount
            end
           )
          ) over
           (partition by (case when FromAccountId < ToAccountId then FromAccountId else ToAccountId end),
                         (case when FromAccountId < ToAccountId then ToAccountId else FromAccountId end)

                         order by PaymentDate
                        ) as cumAMount
from payments;

这只是在金额前面加上一个标志,具体取决于方向。然后,无论付款方向如何,它都会聚合 (FromAccountId, ToAccountId)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2023-04-05
    • 2013-02-08
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多