그룹에 max값 내용 불러오기?? 0 5 174

by 열심열심 [2019.03.12 18:52:24]


col1 col2 version col4
a 123 1  
a 456 2  
a

111

3 ccc
a     ccc
a     ccc

 

col1가 a이고 version 이용하여 최신 a그룹을  뽑고 싶은데 서브쿼리를 너무 많이 타서 하는거 같은데 다른 방법도 있나요? 

select * from t1 where col4 in (select col4 from t1 where col2 = (select col2 from t1 where version = (select max(version) from t1 where col1='a'))

저는 a의 최대 버전값 뽑고 버전을 보고 col2를 뽑고 그걸가지고 col4그룹 값 뽑아서 최종적으로 최신 값들 다 불러왔는데 좀더 간편한 방법이 없을까요?

 

그리고 정규식에서 aa to bb 뽑을려면 regexp_substr("aa" to "bb", '[^"]+',1,2)||regexp_substr("aa" to "bb", '[^"]+',3,4) 이렇게 하는게 맞나요?

 

by 마농 [2019.03.13 09:07:04]

왜 이렇게 복잡한 단계를 거쳐야 하는지 이해가 안가네요.
꼭 이렇게 col1 -> version -> col2 -> col4 단계를 거쳐야 하는 건가요?
중간에 col2 는 빠져도 되는게 아닌가요?
col4 의 ccc 값은 a 에만 있나요? 다른 col1 에 ccc 가 있는 경우는 없는지?
version 도 마찬가지로 3 버전이 다른 코드에도 있을 수 있는데.
a 라는 조건은 매 단계마다 지속적으로 주어야 할 것 같구요.
a 조건이 1단계에만 주어지므로 여러 단계를 거치면서 다른 코드와 섞일 가능성이 보입니다.

정규식 질문도 이해가 안가구요.
쌍따옴표가 왜 나오는지?
aa to bb 뽑는다는게 뭔말인지?


by 열심열심 [2019.03.13 09:49:10]

순서는 상관없습니다. col2는 col4를 찾기위해 사용하였습니다. 

col1은 문서이름 col2는 문서 버전별 아이디 co3는 문서이름별 버전 col4 col1 그룹 이라고 보시면 될 것 같습니다. (col5추가하면 내용들)

a는 처음 col4일때 and일때 한번더 col1='a' 넣었습니다. 

디비구성을 왜 이렇게 한지 모르겠지만 다 떨어져 있는 상태입니다. 

정규식 질문은 디비에 "aa" to "bb" 이렇게 쌍따옴표 들어간상태로 있어서 

"aa" to "bb" - > aa to bb로 변경 하기위해 바꿔 본 것입니다. 

t1테이블 좀더 자세한 부분입니다.

col1 col2 version col4 col5
a 123 1 aaa 333
a 456 2 bbb 444
a 111 3 ccc 555
a 111 3 ccc 666
a 111 3 ccc 777
b 11 1 ee 888
b 11 1 ee 999
b 22 2 ff 1000
bb 22 2 ff 1200

by 마농 [2019.03.13 09:53:58]

테이블 컬럼 값들이 비어 있어서 이해가 안갔었는데..
값을 채워 놓으니 그냥 간단한 거였네요?
col2, col4 를 참조할 필요가 없습니다.
col1, version 만 가지고 푸시면 되는 문제네요.

두번째 질문은 정규식이 필요없는 그냥 단순 Replace 문제네요.
REPLACE('"aa" to "bb"', '"')


by 열심열심 [2019.03.13 10:28:52]

제가 너무 복잡하게 생각했네요. 감사합니다. 

정규식은 중간에 (변경 사항 "aa" to ""bb") 09:01:34 이런식이라 정규식 사용했었습니다. 

또 많이 배워갑니다. 

 


by 마농 [2019.03.13 10:07:51]
-- 1. 서브쿼리
SELECT *
  FROM t1
 WHERE col1 = 'a'
   AND version = (SELECT MAX(version) FROM t1 WHERE col1 = 'a')
;
-- 2. 조인
SELECT a.*
  FROM t1 a
     , (SELECT col1
             , MAX(version) version
          FROM t1
         WHERE col1 = 'a'
         GROUP BY col1
        ) b
 WHERE a.col1    = b.col1
   AND a.version = b.version
;
-- 3. 분석함수
SELECT *
  FROM (SELECT col1, col2, version, col4, col5
             , RANK() OVER(ORDER BY version DESC) rk
          FROM t1
         WHERE col1 = 'a'
        )
 WHERE rk = 1
;

 

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