이전 행까지의 누계


14

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

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

나는이 문제에 대한 많은 솔루션이 있다는 것을 알고 있지만 나는 이해 찾고 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.