테이블 STAT_TABLE
SDT_DATE NODE A_COUNT B_COUNT C_COUNT
20141101 MND 10 11 10
20141102 MND 13 11 11
20141117 MAF 15 17 11
20141203 MAC 9 12 14
20150102 MDC 11 12 14
: : : :
20151117 MND 3 3 3
이런식으로 매일 데이터가 들어가는 구조 있는다 (테이블 예는 위처럼 해놨지만 거의 매일 데이터가 들어가고요 NODE 별로 하루에 한건씩 들어간다고 생각하면 됩니다 )
데이터는 한달 기준 누적 데이터 입니다. ex) MND 라는 노드 20141101 들어간 데이터에 에 추가된 값이 더해져서 20141102 날 들어가는 구조여 서 결국은 그달에 마지막에 들어간 데이터가 최종 누적 데이터가 되는 겁니다.
그래서 2014년 11월에 18까지 데이터가 들어가면 18일 데이터가 최종 누적 데이터가 되는거죠 !
제가 원하는 구조는 사용 자가 20151117일로 검색을 하면 검색날짜 기준으로 일년치는 검색하는 건데 실제로는
20141201 ~20151131 이 검색이 되는 겁니다. 날짜는 자바에서 만들어서 보네도 되고 쿼리에서 만들어도 상관 없을거 같습니다.
검색 결과는
SDT_DATE NODE A_COUNT B_COUNT C_COUNT
201412 MND 20 30 24 -> 2014년 12월에 들어있는 MND 데이터중 마지막날데이터
201501 MND 10 29 11 -> 2015년 01월에 들어있는 MND 데이터중 마지막날데이터
: : : :
201511 MND 12 24 34 -> 2015년 11월에 들어있는 MND 데이터중 마지막날데이터
201412 MAF 12 44 23 -> 2014년 12월에 들어있는 MAF 데이터중 마지막날데이터
201501 MAF 11 24 12 -> 2015년 01월에 들어있는 MAF 데이터중 마지막날데이터
: : : :
201511 MAF 123 22 34 -> 2015년 11월에 들어있는 MAF 데이터중 마지막날데이터
이런 식으로 NODE 별로 1년치 데이터가 나오는 구조 였으면 좋겠습니다.
쿼리조언 좀 부탁 드립니다.
/* 월별 각노드가 존재한다는 가정 */ WITH STAT_TABLE AS( SELECT '20151101' SDT_DATE , 'MND' NODE , 10 A_COUNT , 11 B_COUNT , 10 C_COUNT FROM DUAL UNION ALL SELECT '20151102' , 'MND' , 11 , 12 , 11 FROM DUAL UNION ALL SELECT '20151103' , 'MND' , 12 , 13 , 12 FROM DUAL UNION ALL SELECT '20151201' , 'MND' , 13 , 14 , 13 FROM DUAL UNION ALL SELECT '20151202' , 'MND' , 14 , 15 , 14 FROM DUAL UNION ALL SELECT '20151203' , 'MND' , 15 , 16 , 15 FROM DUAL UNION ALL SELECT '20151204' , 'MND' , 16 , 17 , 16 FROM DUAL UNION ALL SELECT '20151101' , 'MDC' , 10 , 11 , 11 FROM DUAL UNION ALL SELECT '20151102' , 'MDC' , 11 , 12 , 12 FROM DUAL UNION ALL SELECT '20151103' , 'MDC' , 12 , 13 , 13 FROM DUAL UNION ALL SELECT '20151201' , 'MDC' , 13 , 14 , 14 FROM DUAL UNION ALL SELECT '20151202' , 'MDC' , 14 , 15 , 15 FROM DUAL UNION ALL SELECT '20151203' , 'MDC' , 15 , 16 , 16 FROM DUAL UNION ALL SELECT '20151204' , 'MDC' , 16 , 17 , 17 FROM DUAL ) SELECT * FROM (SELECT SUBSTR(SDT_DATE,1,6) SDT_DATE , SDT_DATE AS ORG_SDT_DATE , NODE , A_COUNT , B_COUNT , C_COUNT , ROW_NUMBER() OVER(PARTITION BY SUBSTR(SDT_DATE,1,6) , NODE ORDER BY SDT_DATE DESC ) RN FROM STAT_TABLE ) WHERE RN = 1