带OVER()的SQL查询。使用SQL Server限制输出行

时间:2019-03-12 12:21:47

标签: 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()的方法,并从这些行中获取一个子集。

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

还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用子查询:

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;