row_number() OVER 문의 드립니다. 0 8 3,313

by 민탐탐 [MySQL] row_number mysql [2023.01.12 17:35:29]


안녕하세요. row_number 쿼리 문의 드립니다.

rn이 1인 데이터를 가져오려면 아래의 쿼리를 감싼후에 where rn = 1로 가져올 수가 있는데 

현재의 쿼리에서 rn이 1인것만 가져올 수 있는 방법이 있을까요??


SELECT a1.member_no

, row_number() OVER (PARTITION BY a1.member_no ORDER BY a1.avg_hit_rate desc , a1.top_hit_cnt ) as rn

, a1.join_no

FROM ht_typing_contents_join_log a1

WHERE a1.reg_date >= STR_TO_DATE(CONCAT( date_format(now(), '%Y%m%d' ) , '000000'), '%Y%m%d%H%i%s')

AND a1.reg_date <= STR_TO_DATE(CONCAT( date_format(now(), '%Y%m%d' ) , '235959'), '%Y%m%d%H%i%s')

and a1.success_yn = 'Y'
AND a1.len_type = '1'
by 우주민 [2023.01.12 18:10:28]

where 절이나 having 절에는 분석함수 사용이 안되는 걸로 알고 있습니다.

혹시나 방법이 있는지 저도 궁금하네요.


by pajama [2023.01.12 19:52:42]

마지막에 limit 1 로 하시면 되지 않나요?


by 마농 [2023.01.13 10:21:08]

전체 중 1건 뽑는 거면 LIMIT 으로 가능한데
맴버 별 1건 뽑는 거라 LIMIT 으로 안되요.


by pajama [2023.01.13 11:34:36]

질문을 잘못 이해했군요..^^;


by 최양락 [2023.01.13 09:34:13]
SELECT a1.member_no
	, row_number() OVER (PARTITION BY a1.member_no ORDER BY a1.avg_hit_rate desc , a1.top_hit_cnt ) as rn
	, a1.join_no
from ht_typing_contents_join_log a1
where a1.reg_date >= STR_TO_DATE(CONCAT( date_format(now(), '%Y%m%d' ) , '000000'), '%Y%m%d%H%i%s')
and a1.reg_date <= STR_TO_DATE(CONCAT( date_format(now(), '%Y%m%d' ) , '235959'), '%Y%m%d%H%i%s')
and a1.success_yn = 'Y'
and a1.len_type = '1'
and a1.[pk] = (select distinct first_value([pk]) over(partition by member_no order by avg_hit_rate desc, top_hit_cnt) from ht_typing_contents_join_log t where member_no = a1.member_no)

 


by 마농 [2023.01.13 10:17:05]

1. 이미 방법을 알고 계시네요.
- 인라인뷰 이용하여 조건 주기
- 이 방법이 가장 확실합니다.
2. 질문의 의도가 뭔가요?
- 쿼리 변경 없이는 불가능한데? "현재의 쿼리에서"라고 하신 이유가 뭘까요?
- 정확한 의도를 알아야 답변을 드릴 수 있지 않을까? 생각되네요?


by 민탐탐 [2023.01.13 13:08:44]

안녕하세요.

인라인뷰를 이용하게 되면 많은로우를 가져와서 조건을 주는형태가 되기 때문에

혹시 조건을 주기전에 그룹별 rn이 1인 경우만 가져 올 수있는지 궁금하였습니다.


by 마농 [2023.01.16 08:59:31]

정렬 후 1건을 가져오는 쿼리에서
1건을 가져오기 위해서는 전체를 읽어야 합니다.
인덱스를 이용해 1건을 읽는 방법도 있긴 한데, 이는 그룹별 1건이 아닌 전체 1건의 경우에 해당합니다.
또한, 정렬기준이 비율, 건수 이런 종류인걸로 봐서 인덱스가 있을 것 같지는 않네요.
만약 있다고 하더라도 정렬이 DESC 와 ASC 가 섞여 있어 이용하기 어렵습니다.
이런 류의 쿼리(Top N 쿼리)에서는 ROW_NUMBER 가 그나마 효율적인 쿼리입니다.
전체를 읽고 정렬을 수행하기는 하지만 정렬용 공간을 적게 사용합니다.
정렬용 공간을 전체 행수가 아닌 맴버수 만큼만 사용하게 됩니다.

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