단순히 중복을 제거 한다하면 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
'SQL' 카테고리의 다른 글
CAST, CEILING, SQRT, POWER (0) | 2024.07.05 |
---|---|
SQL에서 정규식 사용하기 (0) | 2024.07.02 |
SQL 문자열 자르기, 대소문자 변경, 문자 합치기 (0) | 2024.07.01 |
두 테이블을 조회 할 때 한쪽에만 있는 값 조회 (0) | 2024.06.28 |
특정 값을 주어 줬을 때 최대 값,최소 값 (0) | 2024.06.27 |