[SQL] SQL에서 계산 델타 (현재 및 이전 행의 차이)
SQLSQL에서 계산 델타 (현재 및 이전 행의 차이)
나는 테이블 등이 있습니다 : 트랜스는 예를 들어 테이블의 이름입니다
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.여기에 원래의 쿼리가 따라 수정입니다 :
여기에 원래의 쿼리가 따라 수정입니다 :
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.당신은 내부 쿼리를 사용할 수 있지만, 반드시 가장 효율적인 쿼리 아니다.
당신은 내부 쿼리를 사용할 수 있지만, 반드시 가장 효율적인 쿼리 아니다.
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.할 수 있습니다 "노조 모두"단순히 델타와 같은 초기의 균형 세트 및 델타 레코드의 ID와 해당 레코드의 ID와 각 계정에 대해 첫 번째 항목을 선택하는 쿼리와 쿼리? 결과는 ID로 주문할 수있다. 더러운하지만이 적용?
할 수 있습니다 "노조 모두"단순히 델타와 같은 초기의 균형 세트 및 델타 레코드의 ID와 해당 레코드의 ID와 각 계정에 대해 첫 번째 항목을 선택하는 쿼리와 쿼리? 결과는 ID로 주문할 수있다. 더러운하지만이 적용?
from https://stackoverflow.com/questions/5078987/calculate-deltadifference-of-current-and-previous-row-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 문자열의 문자와 숫자의 수를 찾기 (0) | 2020.07.02 |
---|---|
[SQL] MySQL의 문 안에 PHP 변수를 포함하는 방법 (0) | 2020.07.02 |
[SQL] 내부를 많이 사용하여 쿼리를 개선하는 것은 wp_postmeta, 키 / 값 테이블에 조인 (0) | 2020.07.02 |
[SQL] 열 이름을 가져옵니다 (0) | 2020.07.02 |
[SQL] C #에서 저장된 프로 시저에서 여러 레코드를 반환 (0) | 2020.07.02 |