9

ウィンドウ関数のヘルプが必要です。

最近、SQL 2012 ウィンドウ関数をいじっています。ウィンドウ内の合計とウィンドウ内の現在の合計を計算できることを知っています。しかし、私は疑問に思っていました。以前の現在の合計、つまり現在の行を含まない現在の合計を計算することは可能ですか? ROW または RANGE 引数を使用する必要があると思いますが、CURRENT ROW オプションがあることは知っていますが、無効な構文である CURRENT ROW - I が必要です。ROW および RANGE 引数に関する私の知識は限られているため、どんな助けも感謝して受け取ります。

この問題には多くの解決策があることを知っていますが、ROW、RANGE の引数を理解しようとしており、これらで問題を解決できると思います。以前の現在の合計を計算する 1 つの可能な方法を含めましたが、より良い方法があるかどうか疑問に思います。

USE AdventureWorks2012

SELECT s.SalesOrderID
    , s.SalesOrderDetailID
    , s.OrderQty
    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID) AS RunningTotal
    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
                         ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal
    -- Sudo code - I know this does not work
    --, SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
    --                   ORDER BY SalesOrderDetailID
    --                   ROWS BETWEEN UNBOUNDED PRECEDING 
    --                                   AND CURRENT ROW - 1) 
    -- AS  SudoCodePreviousRunningTotal
FROM Sales.SalesOrderDetail s
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY s.SalesOrderID
    , s.SalesOrderDetailID 
    , s.OrderQty

前もって感謝します

4

1 に答える 1

23

現在の行の値を減算できます。

SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID
                      ORDER BY SalesOrderDetailID) - s.OrderQty

または、MSDN の構文ypercube の回答によると:

<window frame preceding> ::= 
{
    UNBOUNDED PRECEDING
  | <unsigned_value_specification> PRECEDING
  | CURRENT ROW
}

-->

SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID
                      ORDER BY SalesOrderDetailID
                      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
于 2013-05-24T12:50:09.257 に答える