안녕하세요 질문드릴것이 있어서 글을 올리게 되었습니다.
아래와 같은 데이터가 존재하고 가장 최근(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
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 조건으로 조건절 이행이 발생되고, 이 조건이 다시 인라인뷰 안으로 침투한다는 가정)
쿼리 변환이 원하는 대로 이루어지지 않거나
위의 인덱스가 존재하지 않는다면? 느릴 수 있겠네요.
아래와 같은 방법도 있습니다.
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 ;
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