前の行までの合計


14

ウィンドウ関数に関するヘルプが必要です。ウィンドウ内の合計とウィンドウ内の現在の合計を計算できることを知っています。しかし、前の現在の合計、つまり現在の行を含まない現在の合計を計算することはできますか?

ROWまたはRANGE引数を使用する必要があると思います。私はCURRENT ROWオプションがあることを知っていますが、私CURRENT ROW - 1は無効な構文である必要があります。ROWとのRANGE議論に関する私の知識は限られているので、どんな助けもありがたいことに受けます。

私は、この問題に対する多くのソリューションがあることを知っているが、私は理解しているよROWRANGE引数を、私はこの問題は、これらにひび割れすることが可能と仮定します。以前の実行中の合計を計算する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

回答:


22

答えはを使用する1 PRECEDINGことCURRENT ROW -1です。そのため、クエリでは次を使用します。

    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
                            ORDER BY SalesOrderDetailID
                            ROWS BETWEEN UNBOUNDED PRECEDING 
                                     AND 1 PRECEDING) 
    AS  PreviousRunningTotal

また、他の計算では次のことに注意してください。

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

SQL-Serverはデフォルトの*を 使用しますRANGE UNBOUNDED PRECEDING AND CURRENT ROW。私は、効率の違いがあり、ROWS UNBOUNDED PRECEDING AND CURRENT ROW優先されるべきだと思います(もちろんテストの後、そしてそれがあなたが望む結果を与えるなら)。

パフォーマンステストなど、@ Aaron Bertrandによるブログ記事で詳細を確認できます。合計を実行するための最適なアプローチ -SQL Server 2012用に更新

*もちろん、これはORDER BYOVER句内にが存在する場合のデフォルトの範囲です。そうでない場合、ORDER BYデフォルトなしではパーティション全体になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.