해당 문제는 HackerRank에서 사용한 문제이며 모든 테이블의 자료와 출처는 Hackerank임을 밝힙니다.
해당 글에서는 UNION, JOIN, GROUP BY, HAVING을 모두 사용하여 푸는 문제로 난이도가 매우 높은 문제입니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다
Two pairs (X1, Y1) and (X2, Y2) are said to be symmetric pairs if X1 = Y2 and X2 = Y1.
Write a query to output all such symmetric pairs in ascending order by the value of X. List the rows such that X1 ≤ Y1.
(X1 = Y2이고 X2 = Y1인 경우 두 쌍(X1, Y1)과 (X2, Y2)은 대칭 쌍이라고 합니다.
쿼리를 작성하여 모든 대칭 쌍을 X 값만큼 오름차순으로 출력합니다. X1 ≤ Y1이 되도록 행을 나열합니다.)
해당 문제에서는 X1 과 Y2가 같으면서 X2와 Y1이 같은 경우의 두 쌍을 Functions 테이블에서 찾는 문제입니다.
우선 해당 문제는 이렇게 간단합니다. 저는 어려웠지만요...ㅠㅠ
첫 번째로 X1과 Y2가 둘 다 같은 경우를 먼저 가져올 것입니다.
여기서 명심해 할 것은 둘 다 같은 경우가 두 개인 경우인 값만 가져올 것입니다. 예) 10 10 -> 2개 있어야한다.
이유는 저희는 두 쌍을 찾는 대칭 쌍을 찾기 때문입니다.(행이 하나만 있다면 그 값은 버리겠습니다.)
두 번째로 SELF JOIN을 사용하여 X1 = Y2이고 X2 = Y1 해당 조건에 만족하면서 X1 < Y1보다 큰 값만 찾도록 쿼리를 짤 것입니다.
1. GROUP BY와 COUNT 활용하여 두 쌍인 개수 확인하기
SELECT X, Y, COUNT(*)
FROM functions
WHERE X = Y
GROUP BY X, Y
확인 해 본 결과 2개의 쌍을 가지는 값은 13 13으로 하나 밖에 없었습니다.
2. X=Y인 경우 두 쌍인 값만 가져오기
SELECT X, Y
FROM functions
WHERE X = Y
GROUP BY X, Y
HAVING COUNT(*) = 2
HAVING 절을 통해 COUNT를 했을 경우 2인 경우의 값만 가져오도록 설정하였습니다.
그 결과 위의 사진과 같이 13 13 하나만 가져온 것이 확인 되었습니다.
3. JOIN을 사용하여 X1 = Y2, X2 = Y1인 경우의 값 가져오기
SELECT f1.X, f1.Y
FROM functions f1
INNER JOIN functions f2 ON f1.X = f2.Y and f2.X = f1.Y
WHERE f1.X < f1.Y
WHERE 절을 통해 문제에서 말한 듯이 X1이 Y1보다 크면서 같은 값만 가져오도록 하였습니다.
여기서 '<='를 안쓰고 '<'를 사용한 이유는 1, 2번을 통해 저희는 X와 Y가 같은 값을 찾았기 때문입니다.
그리고 SELF JOIN을 통해 저희는 원하는 값들을 가져올 수 있었습니다.
예: 8 18, 18 8 이렇게 두 값 존재 -> 여기서 WHERE 절을 통해 X보다 Y가 큰 값만 가져오므로 8 18 가져왔음.
4. UNION과 ORDER BY를 통해 두 개의 결과를 합치고 정렬하기
SELECT X, Y
FROM functions
WHERE X = Y
GROUP BY X, Y
HAVING COUNT(*) = 2
UNION
SELECT f1.X, f1.Y
FROM functions f1
INNER JOIN functions f2 ON f1.X = f2.Y and f2.X = f1.Y
WHERE f1.X < f1.Y
ORDER BY X ASC
이렇게 코드를 위에서 보았던 X = Y 값인 13 13이 추가됨과 동시에 오름차순 정렬이 된 것으로 확인이 되며 해당 문제에서 원하는 답이 출력 되게 됩니다.
이상으로 Hacker Rank 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기 (물고기 종류 별 대어 찾기) (0) | 2024.10.28 |
---|---|
[SQL] Programmers 문제 풀기 (연도별 대장균 크기의 편차 구하기) (0) | 2024.10.25 |
[SQL] SELF JOIN 사용하여 문제 풀기 (Rising Temperature) (0) | 2024.10.14 |
[SQL] INNER JOIN 사용하여 문제 풀기 (Type of Triangle) (0) | 2024.10.11 |
[SQL] CASE 사용하여 문제 풀기 (Type of Triangle) (0) | 2024.10.10 |