Group by 추출 질문 ㅠㅠ 0 8 1,755

by 준티 [2016.05.26 13:15:44]


안녕하세요.

혼자 고민해보다가 해결이 되지 않아 질문 드립니다 ㅠ.ㅠ

상황을 설명 드리겠습니다.

history 테이블이 하나 있다고 가정하겠습니다.

그리고 history 테이블에는 id, idx, action, regdate 정도의 컬럼이 있다고 할때..

 

group by id를 하게되면 id별로 그룹이 묶이게 되고

거기서 그룹핑 함수인 max,sum 등을 사용하여 데이터를 id별로 한 행씩 뽑아내는게 일반적이잖습니까..

근데 제가 지금 하고 싶은건 ㅜㅜ id별로 그룹화를 하긴하는데

그룹화해서 나온 행 중에 regdate가 최신인 행이 필요합니다..

현재 상황이 쿼리를 수정하는 방법밖에 없어서.. 해결을 해야하는데 도무지 떠오르질 않네요.

 

다시 상황 설명 드리자면..

id가 a인 데이터가 있다면 아래와 같이 있다면

a 1 쓰기 20160101
a 2 수정 20160526
a 3 수정 20160501

여기서 regdate가 20160526인 저 데이터를 가져오고 싶습니다 ㅠ.ㅠ

group by a를 했는데 어떻게 해야할지..

id는 아주 많고, 각 id별로 최신 데이터를 뽑아야 합니다.

도움 부탁드리겠습니다 ㅠㅠ

by 랑에1 [2016.05.26 13:24:35]
WITH T AS (
SELECT 'a' id, 1 idx, '쓰기' action, '20160101' regdate FROM dual UNION ALL
SELECT 'a' id, 2 idx, '수정' action, '20160526' regdate FROM dual UNION ALL
SELECT 'a' id, 3 idx, '수정' action, '20160501' regdate FROM dual
)

SELECT *
FROM
(
	SELECT T.*, ROW_NUMBER() OVER(PARTITION BY T.id ORDER BY regdate desc) rn FROM T
)
WHERE rn = 1

 


by 우리집아찌 [2016.05.26 13:51:52]
WITH T (id, idx, action, regdate) AS (
SELECT 'a' , '1' ,'쓰기' ,'20160101' FROM DUAL UNION ALL
SELECT 'a' , '2' ,'수정' ,'20160526' FROM DUAL UNION ALL
SELECT 'a' , '3' ,'수정' ,'20160501' FROM DUAL UNION ALL
SELECT 'b' , '11' ,'쓰기2' ,'20160101' FROM DUAL UNION ALL
SELECT 'b' , '22' ,'수정2' ,'20160528' FROM DUAL UNION ALL
SELECT 'b' , '33' ,'수정2' ,'20160501' FROM DUAL 
)

SELECT MAX(T.ID) AS MAX_ID
     , MAX(T.IDX) KEEP (DENSE_RANK FIRST ORDER BY REGDATE DESC) MAX_IDX
     , MAX(T.ACTION) KEEP (DENSE_RANK FIRST ORDER BY REGDATE DESC) MAX_ACTION
     , MAX(T.REGDATE) KEEP (DENSE_RANK FIRST ORDER BY REGDATE DESC) MAX_REGDATE 
  FROM T
 GROUP BY T.ID

 


by 푸르른 [2016.05.26 14:31:34]

선배님들  궁금한게 있습니다 ..ㅋ

랑에님과 아찌님의 방법에대한 차이가 무엇인가요 ?.

 

성능차이인가요 ?>


by 우리집아찌 [2016.05.26 14:55:10]

성능은 다른분이 답변해주실 겁니다.

전 스타일상 

가져오는 컬럼이 많으면 '랑에1' 님것을

한두개 더 가져오면 MAX() KEEP() 사용합니다.


by 푸르른 [2016.05.26 14:57:35]

허접한 질문에 답변 감사합니다 ^^; ㅋ


by jkson [2016.05.26 15:34:03]

row_number야 동순위에 대해 하나의 row를 가지고 오게 되지만

max keep 문은 order by 절로 sort 했을 때 중복되는 데이터가 나올 가능 성이 있으면 약간 문제가 있을 수 있어서 조심해서 사용해야해요.

SELECT 'a' , '3' ,'삭제' ,'20160526' FROM DUAL

이런 데이터가 들어갔을 때 id 'a'의 regdate '20160526'인 데이터는 두개가 되고

두개 중 max(action) '수정'이 되겠죠.

그러면 결과는

a 3 수정 20160526
b 22 수정2 20160528

실제로 idx3의 action은 '삭제'인데 '수정'이 나와버리죠.

서로 다른 row의 데이터가 뒤죽박죽이 됩니다.

중복이 생기지 않게 keep문 안의 order문을 잘 사용하셔야해요.

이 경우 idx가 높은 순으로 나와야 한다면

MAX(T.ACTION) KEEP (DENSE_RANK FIRST ORDER BY REGDATE desc, idx DESC) MAX_ACTION

이렇게 하면 되겠죠.

해서 저는 되도록 row_number를 사용합니다 ㅎ


by 푸르른 [2016.05.26 16:12:48]

jkson

 

답변감사합니다 그런경우가 될수있겠네요

 

상세한 예 까지함께 감사합니다 ㅋ


by 준티 [2016.05.26 16:03:32]

우와 해결되었습니다..

정말 감사합니다

열심히 공부하겠습니다

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