首页 > 解决方案 > 使用 OVER() 的 SQL 查询。使用 SQL Server 限制输出行

问题描述

我的 SQL 很生疏。我正在使用 SQL Server Express 2014。这是一个在我的交易表中输出运行余额的工作查询:

SELECT Id, AccountId, TrxDate, Amount, SUM(Amount) 
OVER(PARTITION BY ClientId, AccountId ORDER BY TrxDate, Id) AS Balance 
FROM AccountTransaction 
WHERE AccountId=1 ORDER BY TrxDate, ID;

这可以很好地获得有效的运行余额列。现在,我需要找到一种方法来始终计算整个表的运行余额,但只输出日期范围内的行。如果我添加 WHERE 子句,则 OVER() 仅应用于过滤的记录。所以我需要一种在整个表上执行 OVER() 的方法,并从这些行中获取一个子集。

在存储过程中,是否可以使用游标遍历某些行,但基于参数(日期间隔)中发送的条件,仅输出某些行?

还有其他方法吗?

标签: sqlsql-server

解决方案


您可以使用子查询:

SELECT Id, AccountId, TrxDate, Amount, 
       SUM(Amount) OVER(PARTITION BY ClientId, AccountId ORDER BY TrxDate, Id) AS Balance,
       (SELECT COUNT(*) FROM AccountTransaction) AS COUNT_OVERALL
FROM AccountTransaction 
WHERE AccountId = 1; 

您还可以使用APPLY

SELECT Id, AccountId, TrxDate, Amount, 
       SUM(Amount) OVER(PARTITION BY ClientId, AccountId ORDER BY TrxDate, Id) AS Balance,
       ATT.CNT AS COUNT_OVERALL
FROM AccountTransaction AT CROSS APPLY
    ( SELECT COUNT(*)
      FROM AccountTransaction 
    ) ATT(CNT)
WHERE AT.AccountId = 1; 

推荐阅读