단순히 중복을 제거 한다하면 GROUP BY 절 혹은 DISTINCT을 이용하여 간단히 중복된 값을 제거 할 수 있다.

그러나 SQL이 단순히 제거만 한다고 끝나면 좋겠지만 그렇지 않은 경우가 있다.

 

예를 들어 city의 문자열의 길이를 구하고 그 구한 길이를 를 통하여 최소값과 최대값을 각각 하나씩 노출 한다고 할 때가 있다

이때 LENGTH() 함수를 통하여 문자열을 길이를 구할 수 있으나 해당 부분으로는 GROUP BY 절이 동작이 안된다.

그럴때에는 ROW_NUMBER() 함수를 이용 PARTITION으로 구분 되는 곳에 순서를 줄 수 있게 된다.

 

아래의 SQL은 먼저 city의 이름과 문자열의 길이를 구하고 그 구한 곳에서 각각 최대,최소 값을 구한 것을 다시 city의 이름과 문자열의 길이를 구하며, 동시에 동일한 문자열의 길이를 구한 곳에 각각 rn이라는 순서 또한 출력을 구한 곳과 비교하여 최대, 최소 값을 칼럼 및 중복된 되었을 때 사전순서가 낮은 순서를 출력하는 sql 문이다.

 

핵심

  • LENGTH() : 문자열 길이 출력
  • ROW_NUMBER() : 순서 출력
  • PARTITION : 데이터베이스에서 데이터를 그룹화하고, 그 그룹 내에서 추가적인 분석을 수행

 

select a.city,a.city_len from (
    select city, LENGTH(city) "city_len" , ROW_NUMBER() OVER(PARTITION BY LENGTH(city)  ORDER BY city) AS rn from station 
)as a, (
    select  min(city_len) "min_len", max(city_len) "max_len" from ( select city, LENGTH(city) "city_len" , ROW_NUMBER() OVER(PARTITION BY LENGTH(city)  ORDER BY city) AS rn from station  ) t
)as b
where a.rn = 1 and ( a.city_len = b.min_len or a.city_len = b.max_len)
order by a.city_len

 

참조 사이트 : https://gent.tistory.com/478

+ Recent posts