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 を含む 4 番目の仮想列が必要です。

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/を指定する必要RANGEがありますOVER

パーティション内の開始点と終了点を指定して、パーティション内の行をさらに制限します。これは、論理的な関連付けまたは物理的な関連付けによって、現在の行に対して行の範囲を指定することによって行われます。物理的な関連付けは、ROWS 句を使用して実現されます。

他のデータベース システムにも同様の機能がある場合があります。この機能は、2012 バージョンの SQL Server の新機能です。

于 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 にはウィンドウ句がありませんか? ウィンドウ句なしで分析関数を作成できるとは思いもしませんでした。上記の SQL は、Oracle と Postgres で問題なく実行されました。デフォルトでは、ウィンドウ句は 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 に答える