안녕하세요
쿼리 요청드릴게 있어서 올립니다.
emp
name | title |
파랑 | 사원 |
노랑 | 대리 |
주황 | 대리 |
분홍 | 과장 |
emp_up 테이블에 4개의 컬럼이 있습니다.
name | date | title |
파랑 | 2015-03-03 | 주임 |
노랑 | 2015-03-03 | 과장 |
파랑 | 2016-03-25 | 대리 |
노랑 | 2016-03-25 | 차장 |
매일하루에 emp_up테이블에 변경된 내용이 있을시 emp_up 테이블로 데이터가 들어옵니다.
구분자는 N으로 하여 하루에 변경이 되면 Y로 변경이 됩니다.
emp_up 테이블에서 이름은 중복되지만 변경된내용은 중복이 되지않아
최신날짜로 변경된 사람들만 뽑고 싶은데 어떻게 해야할까요??
예로 4개만보여줫지 데이터는 엄청 많습니다.
간단하게 말씀드리면
한사람이 진급하거나 부서가 변경될시
emp_up이라는 테이블로 들어옵니다. a라는 컬럼에 N으로해서 데이터가 들어옵니다.
N인 값들을 emp와 비교하여 변경되거나 추가된거에 대해 그값을 변경해주고 추가해줍니다.
그러고나서 emp_up 테이블의 N값을 Y로 바꿔줍니다.
또 동일한 사용자가 진급하거나 부서가 변경되면 또다시 데이터가 emp_up에 들어오고 그값을 emp와 비교하여 변경해줍니다. 그러고 a컬럼의 N값을 Y로 바꿔줍니다.
이게 매일 한번 실행을 하는데
결론으로 제가 알고 싶은거는
동일한 사용자가 변경된값들이 emp_up 테이블에 많이 있는데 이중에 최근날짜로 변경된 값만 보고싶습니다.
위의 emp_up 테이블에 4개의 데이터가있는데 결과로 보고싶은거는
name | date |
파랑 | 2016-03-25 |
노랑 | 2016-03-25 |
입니다.
with emp (nm, title) as ( select '파랑', '사원' from dual union all select '노랑', '대리' from dual union all select '주황', '대리' from dual union all select '분홍', '과장' from dual), emp_up (nm, dt, title) as ( select '파랑','2015-03-03','주임' from dual union all select '노랑','2015-03-03','과장' from dual union all select '파랑','2016-03-25','대리' from dual union all select '노랑','2016-03-25','차장' from dual) select nm,dt from (select a.nm, a.title,b.dt,row_number() over(partition by a.nm order by dt desc) rn from emp a, emp_up b where a.nm = b.nm and a.title <> b.title) where rn = 1;