13

如何使用WHERE子句过滤OVER子句?

即从以下数据

LoanID | Principal | Tenor | AmortizingPrincipal 
----------------------------------------
1         20000       1       5000
1         20000       2       5000
1         20000       3       5000
1         20000       4       5000    

我需要在每个 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

像这样的东西:

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

更新:

以下查询给了我想要的结果:

选择
    L1.*    
    ,BalancePrincipal = AL1.Principal - ISNULL(Cumulative.AmortizingSum,0)
从
    贷款 L1
交叉申请
    (
        选择
            AmortizingSum = SUM(AmortizingPrincipal)
        从
            贷款 L2
        在哪里
            L1.LoanID = L2.LoanID
            和
            L1. 男高音 > L2. 男高音
    ) 累积

可以改善吗?

4

2 回答 2

6

如果您使用的是 SQL Server 2012,您可能希望在以下内容中指定ROWS/ :RANGEOVER

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

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

于 2012-04-05T10:57:23.897 回答
0

对于发布的示例,看起来不需要过滤器:

SELECT LoanID, Principal, Tenor, AmortizingPrincipal
      ,SUM(AmortizingPrincipal) OVER(PARTITION BY LoanID ORDER BY Tenor Desc) AS BalancePrincipal
  FROM loan
  ORDER BY LoanID, Principal, Tenor

更新:

似乎Sql Server 2008 没有windowing 子句?我什至不认为你可以创建一个没有窗口子句的分析函数。上面的 sql 在 Oracle 和 Postgres 上运行没有问题。默认情况下,window 子句是 UNBOUNDED PRECEDING AND CURRENT ROW (from - to)。但是您可以更改顺序并从 CURRENT ROW 转到 UNBOUNDED FOLLOWING。

更新2:

所以我很困惑:如果您无法对分区中的行进行排序,那么(累积)SUM 在分析函数中有什么意义?是否存在隐式排序?我可以更改窗口(如下)并获得相同的结果,但必须提供 ORDER BY(在 Oracle 和 Postgres 中)。如果没有 ORDER BY,我看不出分析 SUM 有什么意义。

SELECT LoanID, Principal, Tenor, AmortizingPrincipal
      ,SUM(AmortizingPrincipal) OVER(PARTITION BY LoanID ORDER BY tenor
                                     RANGE BETWEEN CURRENT ROW
                                       AND UNBOUNDED FOLLOWING) AS BalancePrincipal
  FROM loan
  ORDER BY LoanID, Principal, Tenor
于 2012-04-05T11:43:29.403 回答