[Oracle DB] 첫번째 데이터 가지고 오는 방법 문의 1 3 4,354

by 최대은 [SQL Query] rownum max 첫번째 row [2014.09.23 23:53:08]


안녕하세요, 질문 올립니다.

아래와 같이 두개의 테이블(USER_MAIN, USER_TMP)이 있습니다.

매일(DT_REG) 각 사용자의 몸무게와 키 데이터가 적재됩니다.

이때 각 사용자별로 가장최근(DT_REG기준) 정보로 아래와 같이 SELECT 해오길 원합니다.

※ rownum 을 사용하면 어떨까 하는데 아이디어가 잘 떠오르지 않아 질문 드립니다. 

[희망결과]

ID_USER NM_USER JOB_USER SEQ WEIGHT_USER HEIGHT_USER DT_REG
tom0 톰0 doctor 3 72 172 20140903
tom1 톰1 teacher 3 82 182 20140903
tom2 톰2 student 3 92 192 20140903

[USER_MAIN]

ID_USER(PK) NM_USER JOB_USER
tom0 톰0 doctor
tom1 톰1 teacher
tom2 톰2 student

[USER_TMP]

SEQ ID_USER(PK) WEIGHT_USER HEIGHT_USER DT_REG
1 tom0 70 170 20140901
1 tom1 80 180 20140901
1 tom2 90 190 20140901
2 tom0 71 171 20140902
2 tom1 81 181 20140902
2 tom2 91 191 20140902
3 tom0 72 172 20140903
3 tom1 82 182 20140903
3 tom2 92 192 20140903

 

감사합니다.

 

by 일심 [2014.09.24 09:29:43]

처음 으로 답글을 적어 봅니다.

결과값은 위와 같이 나옵니다. 참고 하시기 바랍니다.

 

with t1 (id_user, nm_user, job_user) as
(
select 'tom0' , '톰0', 'doctor' from dual
union all select 'tom1' , '톰1', 'teacher' from dual
union all select 'tom2' , '톰2', 'student' from dual
),
t2 (seq, id_user, weight_user, height_user, dt_reg) as
(
select 1, 'tom0', 70, 170, '20140901' from dual
union all select 1, 'tom1', 80, 180, '20140901' from dual
union all select 1, 'tom2', 90, 190, '20140901' from dual
union all select 2, 'tom0', 71, 171, '20140902' from dual
union all select 2, 'tom1', 81, 181, '20140902' from dual
union all select 2, 'tom2', 91, 191, '20140902' from dual
union all select 3, 'tom0', 72, 172, '20140903' from dual
union all select 3, 'tom1', 82, 182, '20140903' from dual
union all select 3, 'tom2', 92, 192, '20140903' from dual
)
select id_user
, nm_user
, job_user
, seq
, weight_user
, height_user
, dt_reg
from
(
select
t1.id_user
, t1.nm_user
, t1.job_user
, t2.seq
, t2.weight_user
, t2.height_user
, t2.dt_reg
, row_number() over(partition by t2.id_user order by t2.dt_reg desc) RN
from t2, t1
where t1.id_user= t2.id_user
)
where RN = 1
;


by 아발란체 [2014.09.24 10:18:48]
--일심님 방법 외 고민을 해봤는데 생각보다 어렵네요. = ㅅ =)ㆀ 
--좋은 방법은 아닌 것 같지만 일심님 데이타셋 이용해서 작성해봅니다.

--#1
SELECT
  *
FROM
  T1, T2 
WHERE
  T1.id_user = T2.id_user 
  AND EXISTS(SELECT 1 FROM T2 T3 GROUP BY id_user HAVING MAX(seq) = T2.seq)
;

--#2
SELECT
  DISTINCT 
  MAX(T1.id_user) OVER(PARTITION BY T1.id_user),
  MAX(T1.nm_user) OVER(PARTITION BY T1.id_user),
  MAX(T1.job_user) OVER(PARTITION BY T1.id_user),
  MAX(T2.seq) OVER(PARTITION BY T1.id_user),
  LAST_VALUE(weight_user) OVER(PARTITION BY T1.id_user ORDER BY T1.id_user),
  LAST_VALUE(height_user) OVER(PARTITION BY T1.id_user ORDER BY T1.id_user)
FROM
  T1, T2
WHERE
  T1.id_user = T2.id_user;

 


by 최대은 [2014.09.24 10:26:35]

감사합니다

많은 도움이 되었습니다 ^^

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