이 쿼리에서 COUNT의 SUM을 MAX순으로 5명만 자르고 싶습니다. 0 4 4,804

by TigerStone [SQL Query] Oracle [2017.05.10 02:26:23]


캡처.JPG (23,830Bytes)

SELECT A.IP, A.COUNTRY, A.CNT AS COUNT, A.RANK
FROM(
    SELECT IP, COUNTRY, CNT, ROW_NUMBER() OVER (PARTITION BY IP ORDER BY CNT DESC) AS RANK
    FROM(
        SELECT IP, COUNTRY, COUNT(*) AS CNT
        FROM LOG
        WHERE LOG_TIME BETWEEN TO_DATE('2016/03/01 00:00', 'YYYY-MM-DD HH24:MI') AND TO_DATE('2016/03/07 23:59', 'YYYY-MM-DD HH24:MI')
        GROUP BY IP, COUNTRY
        )
    ) A
WHERE A.RANK <= 3
ORDER BY A.IP DESC, A.CNT DESC

위와 같은 쿼리를 작성하였습니다.

특정 IP가 조회한 게시물들의 국가 카테고리를 COUNT하여, 각 IP별로 COUNT가 높은 3개의 국가를 보여주는 쿼리입니다.

쿼리 실행 결과는 아래의 표입니다.

여기서, IP별로 COUNT의 SUM을 계산한 후, SUM의 내림차순으로 상위 5명만 잘라서 보여주고자 합니다.

그런데 도저히 어떻게 접근해야할지 모르겠네요...

쿼리 하나로 구현하기엔 무리가 있는걸까요?

이를 구현할 수 있는 쿼리를 어떻게 만들어야 할까요?

조언좀 해주시면 정말 감사하겠습니다..

by 마농 [2017.05.10 09:59:47]

앞선 글에서 mysql 사용한다고 하셨는데요?
mysql 인가요? 오라클 인가요? 질문의 카테고리를 확실하게 해주세요.


by TigerStone [2017.05.10 11:38:48]

죄송합니다. 혼동을 드렸네요. 현재 사용중인 DB는 오라클입니다! (차후에 MySQL로 디비를 바꾸어야 하는 상황입니다..)


by 마농 [2017.05.10 13:54:25]
SELECT *
  FROM (SELECT ip
             , COUNT(*) cnt
             , ROW_NUMBER() OVER(ORDER BY COUNT(*) DESC, ip) rn
          FROM log
         WHERE log_time >= TO_DATE('20160301', 'yyyymmdd')
           AND log_time <  TO_DATE('20160307', 'yyyymmdd') + 1
         GROUP BY ip
        )
 WHERE rn <= 5
;

 


by TigerStone [2017.05.11 11:20:24]

아아.. 이렇게 접근하면 되었군요 ㅠㅠ 답변 정말 감사드립니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입