SQL:在OVER()中使用WHERE子句?

Sre*_*ag 13 sql sql-server-2008

如何WHEREOVER子句中使用子句进行过滤?

即来自以下数据

LoanID | Principal | Tenor | AmortizingPrincipal 
----------------------------------------
1         20000       1       5000
1         20000       2       5000
1         20000       3       5000
1         20000       4       5000    
Run Code Online (Sandbox Code Playgroud)

我需要在每个Tenor中使用Balance Principal的第四个虚拟列,如下所示:

LoanID | Principal | Tenor | AmortizingPrincipal | BalancePrinicpal 
-----------------------------------------------------------
1        20000       1       5000                  20000  
1        20000       2       5000                  15000  
1        20000       3       5000                  10000 
1        20000       4       5000                  5000
Run Code Online (Sandbox Code Playgroud)

像这样的东西:

SELECT 
    BalancePrincipal = Principal - SUM(AmortizingPrincipal) OVER(PARTITION BY LoanID WHERE Tenor < this row's tenor) 
Run Code Online (Sandbox Code Playgroud)

更新:

以下查询为我提供了所需的结果:

SELECT 
    L1.*    
    ,BalancePrincipal = AL1.Principal - ISNULL(Cumulative.AmortizingSum,0) 
FROM
    Loan L1
CROSS APPLY 
    (
        SELECT 
            AmortizingSum = SUM(AmortizingPrincipal)
        FROM 
            Loan L2
        WHERE 
            L1.LoanID = L2.LoanID
            AND 
            L1.Tenor > L2.Tenor 
    ) Cumulative

可以改善吗?

Dam*_*ver 6

如果您使用SQL Server 2012中,你会寻找到指定ROWS/ RANGE在你的OVER:

通过指定分区中的起点和终点,进一步限制分区内的行.这是通过逻辑关联或物理关联指定相对于当前行的行范围来完成的.通过使用ROWS子句实现物理关联.

其他数据库系统可能具有类似的功能 此功能是2012版SQL Server中的新功能.