주간으로 데이터 조회하기 1 6 1,142

by 조새롬 [2014.02.18 14:42:43]


SQL문 :: ) 


SELECT id_pc , TO_CHAR(MIN(visit_time), 'YYYY/MM/DD') AS day_num , TO_CHAR(MIN(visit_time), 'DY') AS date_char FROM ci_visitor_info WHERE visit_time >= TO_DATE('2014/01/01', 'yyyy/mm/dd') AND TO_DATE('2014/02/15', 'yyyy/mm/dd') + 1>visit_time AND id_site = 2 GROUP BY TRUNC(visit_time), id_pc ORDER BY DAY_NUM



결과 값 :: )

ID_PC | DAY_NUM | DATE_CHAR |
1 |14/01/01 | 수
2 |14/01/01 | 수
3 |14/01/03 | 금
1 |14/01/05 | 일
2 |14/01/07 | 화
2 |14/01/10 | 금
4 |14/01/10 | 금
5 |14/01/13 | 월
7 |14/01/14 | 화
1 |14/01/18 | 토
2 |14/01/19 | 일
2 |14/01/19 | 일
1 |14/02/01 | 토
1 |14/02/01 | 토
4 |14/02/03 | 월

원하는 결과 값 :: )


ID_PC | DAY_NUM | DATE_CHAR |
1 |14/01/01 | 수
2 |14/01/01 | 수
3 |14/01/03 | 금
1 |14/01/05 | 일

2 |14/01/07 | 화
2 |14/01/10 | 금
4 |14/01/10 | 금

5 |14/01/13 | 월
7 |14/01/14 | 화
1 |14/01/18 | 토
2 |14/01/19 | 일
2 |14/01/19 | 일

2 |14/01/27 | 월
1 |14/02/01 | 토
1 |14/02/01 | 토

4 |14/02/03 | 월

월화주목금토일 주간으로 묶어서 결과값을 도출하며,
그중 ID_PC 값이 중복된다면 제일 빠른 날짜를 들고 오고 싶습니다.


최종 결과 값 :: )


ID_PC | DAY_NUM | DATE_CHAR |
1 |14/01/01 | 수
2 |14/01/01 | 수
3 |14/01/03 | 금

2 |14/01/07 | 화
4 |14/01/10 | 금

5 |14/01/13 | 월
7 |14/01/14 | 화
1 |14/01/18 | 토
2 |14/01/19 | 일

2 |14/01/27 | 월
1 |14/02/01 | 토

4 |14/02/03 | 월

위 데이터를 뽑고싶습니다!!!!

또, 월화수목금토일 주간으로 묶은 IP_PC의 갯수를 구하고 싶습니다.
3
2
4
2
1


도와주세요 ㅠ 제발~~~
by 임상준 [2014.02.18 15:52:25]
이게 맞으려나요...
select
id_pc,
to_char(visit_time, 'yyyy/mm/dd') as day_num,
to_char(visit_time, 'dy') as date_char,
count(id_pc) over(partition by to_char(visit_time, 'iw')) cnt
from (
select
id_pc, visit_time
row_number() over(partition by visit_time, id_pc order by visit_time) rnk
from ci_visitor_info
where visit_time >= to_date('2014/01/01', 'yyyy/mm/dd')
and to_date('2014/02/15', 'yyyy/mm/dd') + 1>visit_time 
and id_site = 2
) a
where rnk=1
order by visit_time
;

by 조새롬 [2014.02.18 17:36:39]

와우 ^^ 대단히 감사합니다 !!!!!
최고에요~


by 조새롬 [2014.02.18 16:00:40]

row_number() over(partition by visit_time, id_pc order by visit_time) rnk
rnk가 모두 1이되어서 데이터 분기를 제대로 못하네요 ㅠ ㅠ

제 핵심은 주간으로...조회하는것입니다  ㅠ ㅠ

그래도 도움주셔서 감사합니다^^

by 임상준 [2014.02.18 16:48:07]
잘못적었구나
row_number() over(partition by TO_CHAR(visit_time, 'IW'), id_pc order by visit_time) rnk
이걸로 바꿔보세요

by DarkBee [2014.02.18 17:17:59]
WITH t (ID_PC , DAY_NUM , DATE_CHAR)AS (
SELECT '1','14/01/01','수'FROM DUAL UNION ALL
SELECT '2','14/01/01','수'FROM DUAL UNION ALL
SELECT '3','14/01/03','금'FROM DUAL UNION ALL
SELECT '1','14/01/05','일'FROM DUAL UNION ALL
SELECT '2','14/01/07','화'FROM DUAL UNION ALL
SELECT '2','14/01/10','금'FROM DUAL UNION ALL
SELECT '4','14/01/10','금'FROM DUAL UNION ALL
SELECT '5','14/01/13','월'FROM DUAL UNION ALL
SELECT '7','14/01/14','화'FROM DUAL UNION ALL
SELECT '1','14/01/18','토'FROM DUAL UNION ALL
SELECT '2','14/01/19','일'FROM DUAL UNION ALL
SELECT '2','14/01/19','일'FROM DUAL UNION ALL
SELECT '2','14/01/27','월'FROM DUAL UNION ALL
SELECT '1','14/02/01','토'FROM DUAL UNION ALL
SELECT '1','14/02/01','토'FROM DUAL UNION ALL
SELECT '4','14/02/03','월'FROM DUAL
)
SELECT t.id_pc
     , t.day_num
     , t.date_char
     , count(*) over ( partition by iw ) cnt
  FROM (
          SELECT t.*
               , row_number() over ( partition by case when date_char = '일' 
                                                       then trunc ( to_date ( day_num, 'rrrr/mm/dd' ) - 1, 'iw' ) 
                                                       else trunc ( to_date ( day_num, 'rrrr/mm/dd' ), 'iw' )
                                                   end 
                                                , id_pc 
                                         order by day_num, id_pc ) rn
               , case when date_char = '일' 
                      then trunc ( to_date ( day_num, 'rrrr/mm/dd' ) - 1, 'iw' )
                      else trunc ( to_date ( day_num, 'rrrr/mm/dd' ), 'iw' ) 
                  end iw
            FROM t
) t
 WHERE rn = 1
 ORDER BY day_num, id_pc

by 조새롬 [2014.02.18 17:37:07]
감사합니다 ^^ 도움이 많이 되었어요~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입