SQL 윈도우 함수에서 순위를 매기는 함수는 ROW_NUMBER, RANK, DENSE_RANK가 있다.
ROW_NUMBER(): 각 행에 고유한 순서를 할당. 동점자가 있어도 순서를 건너 뛰지 않고 연속적인 번호를 부여.
RANK(): 동점자에게 같은 순위를 부여하고, 다음 순위는 동점자 수만큼 건너뜀. 예를 들어, 공동 1위가 2명이라면 다음 순위는 3위가 된다.
DENSE_RANK(): 동점자에게 같은 순위를 부여하지만, 다음 순위는 건너뛰지 않고 연속적인 번호를 부여. 예를 들어, 공동 1위가 2명이라면 다음 순위는 2위가 된다.
SQL에서 서브쿼리를 사용할 때, 일반적으로 서브쿼리에 별칭(alias)을 지정해야 외부 쿼리에서 그 결과를 참조할 수 있다. 그러나 때때로 서브쿼리에서 별칭을 생략하고 결과 열을 직접 참조해도 쿼리가 정상적으로 작동하는 경우가 있다.
select food_type, rest_id, rest_name, favorites
from (
select food_type,
rest_id,
rest_name,
favorites,
rank() over(partition by food_type order by favorites desc) as rnk
from rest_info
) as sub
where sub.rnk = 1
order by food_type desc;
select food_type, rest_id, rest_name, favorites
from (
select food_type,
rest_id,
rest_name,
favorites,
rank() over(partition by food_type order by favorites desc) as rnk
from rest_info
) as sub
where rnk = 1 -- 별칭 'sub'을 생략해도 작동
order by food_type desc;
원래 작성한 쿼리:
select food_type,
rest_id,
rest_name,
favorites
from
(select food_type,
rest_id,
rest_name,
favorites,
rank() over(partition by food_type order by favorites desc) rnk
from rest_info
) as sub
where rnk = 1
order by food_type desc;