max 값이 있는 row 들을 select 0 7 1,362

by 비겁하다욕하지마 [SQL Query] select max sql 튜닝 sql초보 [2017.11.07 14:47:02]


안녕하세요 질문드릴것이 있어서 글을 올리게 되었습니다.

아래와 같은 데이터가 존재하고 가장 최근(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

이 방식으로 했을 경우 속도가 매우 느려서 혹시 다른 방법이 있는지 질문드립니다.

by 우리집아찌 [2017.11.07 15:29:05]
 , (SELECT ID , max(DATE) as DATE

       FROM TABLE

       WHERE ID = 'A1'

       group by ID

) b

 


by 비겁하다욕하지마 [2017.11.07 15:37:49]

우리집아찌님 답변 감사합니다.

그런데 깜빡하고 빠진게있는데 금액을 sum해서 3000이 나와야 해요~ 이부분을 빼먹었네요 죄송합니다


by 우리집아찌 [2017.11.07 16:03:59]

혹시 ID / DATE 단위로 SUM금액을 보고 싶은신건가요?


by 비겁하다욕하지마 [2017.11.07 18:32:40]

A1 | 20170102 | 1000

 

id기준으로 date의 최신값 조건으로 금액을 sum 하려고 합니다.

 

위에 제가 쿼리짠것처럼은 가능한데 고수분들의 더 좋은 방법이 있을까 해서 질문을 드렸습니다


by 마농 [2017.11.07 22:58:45]

변경전 a.id = 'A1'

변경후 b.id = 'A1'


by 마농 [2017.11.08 18:57:28]

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
;

 


by 고수가되고싶어요 [2017.12.07 15:30:05]
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

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입