【发布时间】:2020-03-23 14:50:45
【问题描述】:
我想计算我的选择查询的每一行中的运行总计,以便我可以根据该总计过滤返回的行。在我看来,我只有两个选择。
- 在 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
-
Join自己的桌子
例子:
SELECT T1.DocDate,
T1.Debit,
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
两个查询返回完全相同的结果。不过,在性能方面,建议的方法是什么?
【问题讨论】:
-
一般来说,窗口函数会比更复杂的方法更快。
-
@i_ll_be_back - SQL 不是直接执行的,而是被执行并形成一个“执行计划”;很像编译代码。事实上,例如比较 C 和 SQL; C 是命令式的,而 SQL 是声明式的,这意味着数据库引擎在如何实现您声明的功能需求方面有更广泛的选择。因此,简而言之,编写嵌套查询不一定会导致跨数据的多次迭代。它只是一种表达功能的机制。但是以通常描述的方式加入数据确实会产生明显的开销。
标签: sql sql-server performance cumulative-sum