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 |
감사합니다.
처음 으로 답글을 적어 봅니다.
결과값은 위와 같이 나옵니다. 참고 하시기 바랍니다.
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
;
--일심님 방법 외 고민을 해봤는데 생각보다 어렵네요. = ㅅ =)ㆀ --좋은 방법은 아닌 것 같지만 일심님 데이타셋 이용해서 작성해봅니다. --#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;