본문 바로가기
Data Analysis/SQL

[SQL] 14. SQL 레코드 순서 응용3 (예제 - 테이블에 존재하지 않는 시퀀스 찾기)

by Dlearner 2019. 7. 21.
반응형

[SQL 레코드 순서 응용3]

레코드 안의 순번을 활용하는 예제 - 테이블에 존재하지 않는 시퀀스 찾기

 지난 포스팅에서는 레코드의 순번을 활용하여 중앙값(Median)을 구해보았다. 이번 포스팅에서는 순번을 활용하여 특정 기준을 통해 테이블을 분할하는 실습을 해보려 한다.

 

 

 

 

2. 순번을 사용한 테이블 분할 - 단절 구간 찾기

 

- 집합 지향적 방법 : 집합의 경계선 사용

실습을 하기 위해 Numbers 테이블을 아래와 같이 생성했다. 테이블의 num 필드를 보면, 중간중간에 비어있는 숫자가 있음을 볼 수 있다. 

 

- Numbers 테이블 생성 -

 

 

 

Numbers 테이블을 이용하여 일련의 비어 있는 숫자를 출력하는 쿼리는 아래와 같다.

 

- 집합 지향적 방법으로 비어있는 숫자들을 출력하는 쿼리 -

 

 

 

위의 쿼리를 쉽게 이해하기 위해서 FROM 구에서 만들어지는 테이블(INNER JOIN된 테이블)을 불러와보았다.

 

Numbers 테이블을 두 번 불러와 INNER JOIN을 하는데, 여기서 중요한 것은 N2.num의 레코드 값이 N1.num의 값보다 큰 값들만을 출력해 오는 것이다. 

 

옆의 출력된 결과에서 네모박스 쳐진 부분의 가장 상단의 레코드들이 각 집합의 경계선이 될 부분이다. 각 집합의 가장 상단의 레코드들은 MIN(N2.num)으로 불러올 수 있다.

 

---------------------------------------------------------------

 

다시 위의 쿼리로 돌아가 살펴보면, N1.num + 1 값이 MIN(N2.num) 값과 같으면 단절이 없고, N2.num 값보다 작으면 단절이 있다는 것을 알 수 있다. 

 

이러한 방식을 통해 집합 지향적 방법으로 단절된 구간을 찾을 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- 절차 지향적 방법 : 다음 레코드와 비교

절차 지향적인 방법에서는, '현재 레코드와 다음 레코드의 숫자 차이를 비교하고, 차이가 1이 아니라면 사이에 비어있는 숫자가 있다'라는 매우 단순한 방법을 사용할 것이다. 특별한 방법은 아니지만, 대표적인 절차 비향적 방법으로 이해하기 어렵지 않다.

 

절차 지향적인 방법으로 쿼리를 작성한 예시는 아래와 같다.

 

- 절차 지향적 방법으로 비어있는 숫자들을 출력하는 쿼리 -

 

 

 

절차 지향적 방법에서도 이해를 돕기위해 FROM 구에서 사용된 서브쿼리를 가져와 보도록 하겠다. 서브쿼리의 결과는 아래와 같다.

 

- 절차 지향적 방법에서 사용하는 서브 쿼리 결과 -

위의 쿼리에서 num 필드는 현재 숫자를 나타내고, next_num 필드는 다음 숫자를 나타낸다. 두 필드값의 차이를 구하여 단절의 구간을 찾는 것인데, 이 차이값을 앞선 쿼리에서 diff 필드로 명명하였다. WHERE 구에서 diff<>1이라는 조건을 통해, 두 값의 차이가 1이 아니면 단절 구간이라는 것을 알려준다.

 

 

 

 

다음 포스팅에서도 레코드의 순번을 활용하는 예제를 다룰 것이다. 여태까지는 테이블에 존재하지 않는 시퀀스를 찾았는데, 다음 예제부터는 테이블에 존재하는 수열을 그룹화하여 활용해보는 예제를 실습해볼 것이다.

반응형

댓글