이전 행까지의 누계


14

윈도우 기능에 대한 도움이 필요합니다. 창 내 합계와 창 내 누적 합계를 계산할 수 있다는 것을 알고 있습니다. 그러나 이전 누적 합계, 즉 현재 행을 포함하지 않는 누적 합계를 계산할 수 있습니까?

ROW또는 RANGE인수 를 사용해야한다고 가정합니다 . CURRENT ROW옵션이 있지만을 (를) 알고 싶습니다 CURRENT ROW - 1. 이는 유효하지 않은 구문입니다. ROWRANGE논쟁에 대한 나의 지식 은 제한적이므로 어떤 도움도 감사하게 받아 들일 것이다.

나는이 문제에 대한 많은 솔루션이 있다는 것을 알고 있지만 나는 이해 찾고 ROW, RANGE인수를 나는 문제가이 금이 될 수있다 가정합니다. 이전 누적 합계를 계산하는 한 가지 방법을 포함했지만 더 나은 방법이 있는지 궁금합니다.

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 BY안에가 있을 때의 기본 범위입니다. OVER그렇지 않으면 ORDER BY기본값이 없으면 전체 파티션이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.