在SQL中计算运行总计的最快方法

我想在选择查询的每一行中计算运行总计,以便我可以基于该总计过滤返回的行。我的看法只有两种选择。

  1. 在select语句中使用over,并使主查询成为子查询

示例:

SELECT DocDate,Debit,RunningTotal
FROM
(
    SELECT T1.DocDate,T1.Debit,SUM(T1.Debit) OVER(ORDER BY T1.DocDate DESC) AS RunningTotal
        FROM Invoices T1
) AS T
WHERE RunningTotal < @CurrentBalance 
  1. Join表本身

示例:

SELECT T1.DocDate,SUM(T2.Debit) AS RunningTotal
FROM Invoices T1
JOIN Invoices T2 ON T1.DocDate <= T2.DocDate
GROUP BY T1.DocDate,T1.Debit
   HAVING SUM(T2.Debit) < @CurrentBalance
ORDER BY T1.DocDate DESC

两个查询都返回完全相同的结果。不过从性能角度来看,建议的前进方式是什么?

ksjfhvqkugt9a 回答:在SQL中计算运行总计的最快方法

除非表中的行太少以至于您只能对它们进行计数,否则内置的窗口功能将变得更快。

为什么?首先,它是内置的并且为此目的而设计。

第二,它实际上计算出一个累加和。因此,在计算第十个值时,它使用的是第九个累加总和的结果,并向其累加一个值。

join方法是一种特别糟糕的计算方法。如果表中有100行,则它将表扩展为100 * 99/2行(给定或取)-然后必须聚合超过100行。您会看到随着表的增大,这种情况只会变得更糟。

也就是说,如果表中有三行,您可能会发现联接效果更好。这就是大数定律:有时在小数上会发生令人惊讶的事情。

本文链接:https://www.f2er.com/2596570.html

大家都在问