오라클에서 날짜별로 갯수 카운트해서 최고 순위를 나타내고 싶습니다 ㅠㅠㅠ 3

by 민교민교 [SQL Query] [2022.07.14 00:07:22]


노래 재생을 하면 일정시간 뒤에 playinfo 테이블에 insert가 됩니다!

playinfo에 insert된 갯수(플레이 횟수)에 따라 일간 월간 차트도 나타내고 있구여!

근데 예를 들어 s_no = 1 , a_no = 1 인 노래의 지금까지의 일간 최고 순위(플레이 횟수 기준)를 알고 싶은데 도저히 안되고 있습니다 ㅠㅠㅠ

select substr(p_date,0,8), s_no, a_no from playinfo group by substr(p_date,0,8),s_no,a_no order by substr(p_date,0,8);

날짜별로 짤라서 데이터는 분류해놨는데, 여기서 순위를 멕이고 그 순위들 중에 최고 순위 뽑아오는게 도저히 모르겠습니다...

테이블 구성과 샘플로 들어가있는 데이터는 첨부하였습니다 ㅠㅠㅠ

by 신이만든지기 [2022.07.14 08:15:16]
SELECT RANK() OVER(ORDER BY play_cnt DESC) NO
     , p_date
     , play_cnt
FROM
    (
        SELECT trunc(p_date, 'DD') p_date, count(p_no) play_cnt
        FROM playinfo
        WHERE a_no = 1 AND s_no = 1
        GROUP BY trunc(p_date, 'DD')
    )

 


by 마농 [2022.07.14 08:20:57]

날짜 타입에 문자 함수인 SUBSTR 사용은 잘못된 사용입니다.
또한, SUBSTR 함수의 시작점은 0 이 아닌 1 입니다.

SELECT *
  FROM (SELECT s_no
             , a_no
             , ymd
             , cnt
             , rk
             , RANK() OVER(PARTITION BY s_no, a_no ORDER BY rk) rk1
          FROM (SELECT s_no
                     , a_no
                     , TO_CHAR(p_date, 'yyyymmdd') ymd
                     , COUNT(*) cnt
                     , RANK() OVER(PARTITION BY TO_CHAR(p_date, 'yyyymmdd')
                                       ORDER BY COUNT(*) DESC) rk
                  FROM playinfo
                 GROUP BY s_no, a_no
                     , TO_CHAR(p_date, 'yyyymmdd')
                )
         WHERE s_no = 1
           AND a_no = 1
        )
 WHERE rk1 = 1
;

 


by 민교민교 [2022.07.15 02:03:20]

 

으아 마농님 감사합니다. 한가지만 더 여쭙자면 ㅠㅠ 지금 보여주신 쿼리가 rk1=1 인 조건인데 1위인 조건 말구 그동안의 rk1 중에서 제일 높은 rk1이 필요합니당 ㅠㅠ 답해주신 쿼리 분석하는데만 오래걸린 저로서는 where 조건 바꾸는것도 힘겹네여 으 ㅠㅠ 어찌 저렇게 짜시지 ㅠㅠ


by 민교민교 [2022.07.15 16:20:36]

아 그렇군요ㅠㅠ 감사합니다 정말


by 마농 [2022.07.15 09:07:09]

잘못 판단하신 것 같습니다.
rk 가 순위입니다.
rk1 은 순위가 아니라 순위(rk)가 가장 높은 것을 찾기 위한 도구입니다.

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