프로그래머스 SQL - 48, 49번 (윈도우 함수 순위, 서브쿼리 별칭)

yeyeyeyeye·2025년 7월 28일

SQL 윈도우 함수에서 순위를 매기는 함수는 ROW_NUMBER, RANK, DENSE_RANK가 있다.

  1. ROW_NUMBER(): 각 행에 고유한 순서를 할당. 동점자가 있어도 순서를 건너 뛰지 않고 연속적인 번호를 부여.

  2. RANK(): 동점자에게 같은 순위를 부여하고, 다음 순위는 동점자 수만큼 건너뜀. 예를 들어, 공동 1위가 2명이라면 다음 순위는 3위가 된다.

  3. DENSE_RANK(): 동점자에게 같은 순위를 부여하지만, 다음 순위는 건너뛰지 않고 연속적인 번호를 부여. 예를 들어, 공동 1위가 2명이라면 다음 순위는 2위가 된다.


서브쿼리에서 별칭을 생략하고 참조할 수 있는 이유와 발생할 수 있는 오류

SQL에서 서브쿼리를 사용할 때, 일반적으로 서브쿼리에 별칭(alias)을 지정해야 외부 쿼리에서 그 결과를 참조할 수 있다. 그러나 때때로 서브쿼리에서 별칭을 생략하고 결과 열을 직접 참조해도 쿼리가 정상적으로 작동하는 경우가 있다.

  1. 기본적인 서브쿼리 사용법:
    서브쿼리에서는 일반적으로 다음과 같이 별칭을 사용하여 결과를 참조:
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;
  1. 별칭 생략 가능:
    그러나 SQL에서 서브쿼리의 열을 외부 쿼리에서 참조할 때, 서브쿼리의 열 이름이 외부 쿼리에서 자동으로 유효하게 인식됨. 그래서 서브쿼리의 별칭을 생략해도 SQL 엔진이 열을 인식하고 결과를 반환할 수 있다:
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;
  1. 내가 범했던 오류:
    처음에 작성한 쿼리에서 rank() 함수의 결과를 외부 쿼리에서 rnk = 1으로 필터링하려고 했음. 이 때, 서브쿼리에 별칭을 지정해주지 않아서 오류가 발생.

원래 작성한 쿼리:

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;
  1. 왜 가능한가?
    SQL 엔진은 서브쿼리에서 계산된 열을 외부 쿼리와 결합할 때, 서브쿼리 내의 열 이름을 외부 쿼리에서 자동으로 참조 가능하게 만듦. 따라서 별칭 없이 열 이름을 직접 참조할 수 있다.
profile
안녕하세요? 데이터분석가 되고 싶어요.

0개의 댓글