[SQL Runday] HackerRank - Symmetric Pairs
3724 단어 sqlhackerrank1일1sql1일1sql
X, Y 각각의 값을 갖는 테이블 Functions가 있다.
- X1 = Y2, X2 = Y1 조건을 만족한다면 (X1, Y1), (X2, Y2) 두 값은 대칭쌍이다.(Symmetric pairs)
- 모든 대칭 쌍을 출력하는 쿼리를 작성해라.
- X 값 기준으로 오름차순 정렬해라.
- X1 <= Y1인 값만 조회해라.
Table
다음과 같은 X, Y 값을 갖는 테이블 Functions가 있다.
Key points
- 1,10, 10, 1 < 이렇게 대칭을 이루는 쌍을 찾아야 함.
- 출력은 1,10 < 이 쌍만 하면 됨.
- 우선 X1 = Y2 두 값을 기준으로 Join 해야 겠다는 생각을 했음.
- 그리고 where 조건으로 X2 = Y1를 만족하는 행들만 조회하고, f.X <= f.Y 조건을 추가하면 되겠다고 생각함
Errors
- 그러자 문제가 생겼는데, 어차피 똑같은 테이블이므로 자기 자신과 똑같은 행도 대칭 쌍처럼 조회가 되었음.
- 2 2 값을 갖고 있는 행이 2 2 2 2 이렇게 다 조회가 됨.
- 그게 아니라 2 2 값을 갖고 있으면 자기 자신 아닌 다른 행이 2 2 여야 2 2 가 대칭쌍으로 받아들여지는 것.
- 이를 해결하기 위해
row_index
변수를 각 테이블 마다 만들었음. - 전 문제도 이런식으로 풀었는데 이렇게 하는게 좋은 방법인지는 모르겠다?
- 그런데도 마지막에 13 13 < 이게 두 번 찍혀서
distinct
로 한번만 불러오게 조회함.- 이게 맞는 방법인지는 확실하지 않다. 다른 사람은 어떻게 풀었는지 discussion 확인해봐야 할듯.
최종 쿼리
set @index = 0;
set @index1 = 0;
select distinct f.X, f.Y
from (select X, Y, @index:= @index+1 as row_index from functions)f
inner join(select X, Y, @index1:= @index1+1 as row_index1 from functions)f1
on f.X = f1.Y
where f.Y = f1.X and f.X <= f.Y and row_index != row_index1
order by f.X
Author And Source
이 문제에 관하여([SQL Runday] HackerRank - Symmetric Pairs), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@honeybeat1/SQL-Runday-HackerRank-Symmetric-Pairs저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)