본문 바로가기

코딩일기

SQL 코드카타 178 - Symmetric Pairs

https://www.hackerrank.com/challenges/symmetric-pairs/problem?isFullScreen=true

 

Symmetric Pairs | HackerRank

Write a query to output all symmetric pairs in ascending order by the value of X.

www.hackerrank.com

 

Column Type
X Integer
Y Integer

 

Functions 테이블:

  • X, Y : 테이블의 두개의 열

두 개의 열 X와 Y가 있습니다.

(X1, Y1)과 (X2, Y2) 두 쌍이 X1 = Y2이고 X2 = Y1일 때 대칭 쌍이라고 합니다.

모든 대칭 쌍을 X 값 기준으로 오름차순으로 출력하는 쿼리를 작성하세요. X1 ≤ Y1인 행만 나열하세요.

 

select *,
    row_number() over () r
from Functions

 

각 행에 번호를 붙여서 출력한다. 각 행을 자기자신의 다른 모든 행들과 비교하기 위함이다.

 

select *
from
(select *,
    row_number() over () r
from Functions) f1
left join (select *,
    row_number() over () r
from Functions) f2 on f1.r <> f2.r

 

자기 자신에 행 번호를 붙여서 행 번호가 다른 행을 기준으로 결합한다. 자기 자신과의 결함을 방지하기 위함이다.

 

select *
from
(select *,
    row_number() over () r
from Functions) f1
left join (select *,
    row_number() over () r
from Functions) f2 on f1.r <> f2.r
where
    f1.X = f2.Y and
    f2.X = f1.Y and
    f1.X <= f1.Y

 

where문에 조건을 작성해준다. 대칭 쌍을 구하기 위해서 X1 = Y2이고 X2 = Y1인 조건을 작성하고 X1 ≤ Y1인 행만 나열하기 위해 추가적으로 조건을 작성한다.

 

select
    distinct f1.X,
    f1.Y
from
(select *,
    row_number() over () r
from Functions) f1
left join (select *,
    row_number() over () r
from Functions) f2 on f1.r <> f2.r
where
    f1.X = f2.Y and
    f2.X = f1.Y and
    f1.X <= f1.Y
order by f1.X

 

X에 대해서 정렬한 후, X와 Y를 X에서 중복제거 하여 출력하면 완료!

 

아직까지는 비슷한 문제가 나왔을 때 같은 논리를 적용할 자신이 없다..