어제 구루비에서 많은 도움과 배움을 받았는데, 한번 더 요청 드리겠습니다!
이번건은 과제 테스트이긴 한데, 이 부분이 너무 안풀려서 진행이 안됩니다..ㅠ
스크린샷과 같은 테이블(테이블명은 임의로 A_TABLE 이라 하겠습니다.)이 있을때 다음과 같은 요구사항을 한번의 쿼리로 도출 할 수 있을까요?
집계함수를 써서 어떻게 흉내를 내봤는데, TOP5 메뉴부분에서 너무 헤매고 있습니다..!
원하는 결과를 올려주세요. 내용만으로는 모르겠네요.
| BASE_DATE | USER_NO | TOP1 | TOP2 | TOP3 | TOP4 | TOP5 | 00_06 | 06_09 | 09_13 | 13_16 | 16_19 | 19_21 | 21_24 | |
| 1 | 20190301 | 001 | 내사용정보 | 내정보 | 내카드 | 세이프박스 | 이체내역 | 3 | 2 | 5 | 1 | 2 | 4 | 2 |
| 2 | 20190302 | 001 | 모임통장 | 가이드 | 내정보 | 이체내역 | 내카드 | 5 | 0 | 2 | 9 | 8 | 1 | 3 |
이런식으로 기준일자와 USR_NO를 기준으로 정렬된 값을 보고 싶습니다!
-- TOP 1~5 만 구현했어요 OUTER JOIN으로 JOIN 하시면 될겁니다.
-- TOP 이 같다면 ORDER BY 조건을 추가하세요.
-- 손으로 적는거라 오타 있을수 있어요
SELECT BASE_DATE
, USR_NO
, MAX(CASE WHEN RN =1 THEN MENU_NM END ) TOP1
, MAX(CASE WHEN RN =2 THEN MENU_NM END ) TOP2
, MAX(CASE WHEN RN =3 THEN MENU_NM END ) TOP3
, MAX(CASE WHEN RN =4 THEN MENU_NM END ) TOP4
, MAX(CASE WHEN RN =5 THEN MENU_NM END ) TOP5
FROM ( SELECT BASE_DATE
, USR_NO
, MENU_NM
, ROW_NUMBER() OVER(PARTITION BY BASE_DATE , USR_NO ORDER BY MENU_CNT DESC ) RN
FROM ( SELECT DISTINCT
TO_DATE(날짜,'YYYYMMDD' ) BASE_DATE
, USER_NO
, MENU_NM
, COUNT(*) OVER(PARTITION BY TO_CHAR(날짜,'YYYYMMDD')) MENU_CNT
FROM A_TABLE
)
)
GROUP BY BASE_DATE , USR_NO
SELECT ymd
, usr_no
, MIN(CASE rn WHEN 1 THEN menu_nm END) top1
, MIN(CASE rn WHEN 2 THEN menu_nm END) top2
, MIN(CASE rn WHEN 3 THEN menu_nm END) top3
, MIN(CASE rn WHEN 4 THEN menu_nm END) top4
, MIN(CASE rn WHEN 5 THEN menu_nm END) top5
, IFNULL(SUM(cnt1), 0) cnt_00_06
, IFNULL(SUM(cnt2), 0) cnt_06_09
, IFNULL(SUM(cnt3), 0) cnt_09_13
, IFNULL(SUM(cnt4), 0) cnt_13_16
, IFNULL(SUM(cnt5), 0) cnt_16_19
, IFNULL(SUM(cnt6), 0) cnt_19_21
, IFNULL(SUM(cnt7), 0) cnt_21_24
FROM (SELECT ymd
, usr_no
, menu_nm
, ROW_NUMBER() OVER(PARTITION BY ymd, usr_no
ORDER BY COUNT(*) DESC, menu_nm) rn
, COUNT(CASE WHEN hh >= '00' AND hh < '06' THEN 1 END) cnt1
, COUNT(CASE WHEN hh >= '06' AND hh < '09' THEN 1 END) cnt2
, COUNT(CASE WHEN hh >= '09' AND hh < '13' THEN 1 END) cnt3
, COUNT(CASE WHEN hh >= '13' AND hh < '16' THEN 1 END) cnt4
, COUNT(CASE WHEN hh >= '16' AND hh < '19' THEN 1 END) cnt5
, COUNT(CASE WHEN hh >= '19' AND hh < '21' THEN 1 END) cnt6
, COUNT(CASE WHEN hh >= '21' AND hh < '24' THEN 1 END) cnt7
FROM (SELECT usr_no
, menu_nm
. SUBSTR(log_tktm, 1, 8) ymd
, SUBSTR(log_tktm, 9, 2) hh
FROM t
WHERE menu_nm NOR IN ('login', 'logout')
) a
GROUP BY ymd, usr_no, menu_nm
) a
GROUP BY ymd, usr_no
;