안녕하세요 질문드릴것이 있어서 글을 올리게 되었습니다.
아래와 같은 데이터가 존재하고 가장 최근(max 일자) 의 금액만 가져오려고 하는데요 서브쿼리를 사용해서 sql 작성을 해 보았는데 속도가 느려서 혹시 다른 방법이 있는지 질문드립니다.
결과는 max일자만 sum해서 3000이 나와야 합니다
테이블
ID | DATE | AMT
A1 | 20170101 | 1000
A1 | 20170101 | 1000
A1 | 20170101 | 1000
A1 | 20170102 | 1000
A1 | 20170102 | 1000
A1 | 20170102 | 1000
1 2 3 4 5 6 7 8 9 | SELECT a.ID , a. DATE , SUM (a.AMT) FROM TABLE a , ( SELECT ID , max ( DATE ) as DATE FROM TABLE group by ID) b WHERE a.ID = 'A1' and a.ID = b.ID and a. DATE = b. DATE group by a.ID , a. DATE |
이 방식으로 했을 경우 속도가 매우 느려서 혹시 다른 방법이 있는지 질문드립니다.
id, date 로 이루어진 인덱스가 존재한다면?
크게 느리지 않을 것 같습니다.
(a.id 조건이 b.id 조건으로 조건절 이행이 발생되고, 이 조건이 다시 인라인뷰 안으로 침투한다는 가정)
쿼리 변환이 원하는 대로 이루어지지 않거나
위의 인덱스가 존재하지 않는다면? 느릴 수 있겠네요.
아래와 같은 방법도 있습니다.
1 2 3 4 5 6 7 8 9 10 11 | SELECT * FROM ( SELECT id , date , SUM (amt) amt FROM TABLE WHERE a.id = 'A1' GROUP BY id, date ORDER BY id, date DESC ) WHERE ROWNUM = 1 ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | WITH t AS ( SELECT 'A1' ID, '20170101' DT , 1000 AMT FROM DUAL UNION ALL SELECT 'A1' ID, '20170101' DT , 1000 AMT FROM DUAL UNION ALL SELECT 'A1' ID, '20170101' DT , 1000 AMT FROM DUAL UNION ALL SELECT 'A1' ID, '20170102' DT , 1000 AMT FROM DUAL UNION ALL SELECT 'A1' ID, '20170102' DT , 1000 AMT FROM DUAL UNION ALL SELECT 'A1' ID, '20170102' DT , 1000 AMT FROM DUAL UNION ALL SELECT 'A1' ID, '20170103' DT , 1000 AMT FROM DUAL ) SELECT ID ,DT , SUM (AMT) FROM T A WHERE DT IN ( SELECT MAX (DT) FROM T ) GROUP BY ID,DT |