복붙노트

[SQL] SQL에서 계산 델타 (현재 및 이전 행의 차이)

SQL

SQL에서 계산 델타 (현재 및 이전 행의 차이)

나는 테이블 등이 있습니다 : 트랜스는 예를 들어 테이블의 이름입니다

Id | Trans_Date          | Account_Id | Amount | Delta
------------------------------------------------------
1  | 2011-02-20 00:00:00 |     2      | 1200   | NULL
------------------------------------------------------
2  | 2011-03-21 00:00:00 |     2      | 2000   | NULL
------------------------------------------------------
3  | 2011-04-22 00:00:00 |     2      | 4500   | NULL
------------------------------------------------------
4  | 2011-02-20 00:00:00 |     4      | 1000   | NULL
------------------------------------------------------
5  | 2011-03-21 00:00:00 |     4      | 2400   | NULL
------------------------------------------------------
6  | 2011-04-22 00:00:00 |     4      | 3000   | NULL
------------------------------------------------------

그리고 델타 열을 업데이트해야합니다. 어떤 값이 동일한 계정의 현재 행 한달 하나의 트랜잭션이있는 가정 동일한 계정 선행 행의 차이이다. 여기서 보정 값을 생성 할 수있는 더미 SQL은

select tt1.id, tt1.amount , tt1.AccountId,(tt1.amount-tt2.amount) as delta 
from trans tt1 left outer  JOIN trans  tt2 
on tt1.accountid = tt2.accountid
where month(tt1.date1)-month(tt2.date1)=1 ;

이 쿼리의 결과는

id | amount | AccountId  | delta  |
-------------------------------------
2  | 2000   |     2      | 800    | 
-------------------------------------
3  | 4500   |     2      | 2500   |
-------------------------------------
5  | 2400   |     4      | 1400   | 
-------------------------------------
6  | 3000   |     4      | 600    | 
-------------------------------------

그러나 어떤 행이 선행되지 않은 행의 델타 등의 양이어야

1  | 1200   |     2      | 1200   | 
-----------------------------------------
4  | 1000   |     4      | 1000   | 
-----------------------------------------

이러한 방법에 의해 누락되었습니다.

이 쿼리를 해결 도와주세요.

해결법

  1. ==============================

    1.여기에 원래의 쿼리가 따라 수정입니다 :

    여기에 원래의 쿼리가 따라 수정입니다 :

    select
      tt1.id,
      tt1.amount,
      tt1.AccountId,
      (tt1.amount-ifnull(tt2.amount, 0)) as delta
    from trans tt1
      left outer JOIN trans tt2 on tt1.accountid = tt2.accountid
        and month(tt1.date1)-month(tt2.date1)=1;
    

    월 비교 가입 왼쪽하는 차이가있는 곳에서의 이동되고,이 tt2.amount IFNULL (tt2.amount, 0)으로 대체된다.

    스크립트의 업데이트 버전 :

    update tt1
    set delta = (tt1.amount-ifnull(tt2.amount, 0))
    from trans tt1
      left outer JOIN trans tt2 on tt1.accountid = tt2.accountid
        and month(tt1.date1)-month(tt2.date1)=1;
    

  2. ==============================

    2.당신은 내부 쿼리를 사용할 수 있지만, 반드시 가장 효율적인 쿼리 아니다.

    당신은 내부 쿼리를 사용할 수 있지만, 반드시 가장 효율적인 쿼리 아니다.

    UPDATE trans
    SET Delta = Amount - 
    (SELECT Amount FROM trans t1
    WHERE t1.Trans_Date < trans.Trans_Date
    ORDER BY t1.Trans_Date DESC LIMIT 1)
    
  3. ==============================

    3.할 수 있습니다 "노조 모두"단순히 델타와 같은 초기의 균형 세트 및 델타 레코드의 ID와 해당 레코드의 ID와 각 계정에 대해 첫 번째 항목을 선택하는 쿼리와 쿼리? 결과는 ID로 주문할 수있다. 더러운하지만이 적용?

    할 수 있습니다 "노조 모두"단순히 델타와 같은 초기의 균형 세트 및 델타 레코드의 ID와 해당 레코드의 ID와 각 계정에 대해 첫 번째 항목을 선택하는 쿼리와 쿼리? 결과는 ID로 주문할 수있다. 더러운하지만이 적용?

  4. from https://stackoverflow.com/questions/5078987/calculate-deltadifference-of-current-and-previous-row-in-sql by cc-by-sa and MIT license