You are given a table, Functions, containing two columns: X and Y.
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.
Problem
- 각각의 짝을 출력하는 쿼리를 작성하라.
- 단, X의 값을 기준으로 내림차순, X<=Y인 경우만 row로 출력하라.
Answer1
SELECT F.X, F.Y
FROM Functions F, Functions Temp_F
WHERE F.X = Temp_F.Y
AND F.Y = Temp_F.X
GROUP BY F.X, F.Y HAVING COUNT(*)>=2 OR F.X < F.Y
ORDER BY F.X
이것도 풀고나면 쉬운 문제였는데 상당히 헤매었던 문제다.
처음부터 셀프 조인(self join)으로 접근하면 쉽게 풀 수 있었을텐데 계속 서브쿼리, 서브쿼리만 하다보니 쉽게 떠올리지 못했다.
물론 where절 서브쿼리로도 풀어 볼 수 있을 것 같은데, 다음으로 미뤄본다.
How to solve
처음에는 X를 기준으로 조건에 충족하는 Y만 뽑아서 저장하려고 서브쿼리를 생각해봤다.
하지만 애초에 성립이 불가능한 쿼리였다.
지금 생각하면 내가 뭘 하려고 했던 건지도 잘 모르겠다.
SELECT F.X
,(SELECT DISTINCT F2.Y
FROM Functions F2
WHERE F2.Y = F.Y
AND concat(F.Y, F.X) = concat(F2.X,F2.Y)
) Y
FROM Functions F
GROUP BY F.X, Y HAVING COUNT(*) >= 2 OR F.X > Y
ORDER BY F.X
두 번째로 시도한 방법은 where절에 서브쿼리를 넣어보는 방법이었다.
역시 X의 값을 기준으로 조건에 충족하는 Y값만 가져오려는 방법이었는데, 이건 X=Y인 13만 추출되었다.
이 때, 애초에 저렇게 묶어버리면 HAVING절의 COUNT는 의미가 없어져 버린다.
SELECT F.X, F.Y
FROM Functions F
WHERE F.X IN (SELECT F2.Y
FROM Functions F2
WHERE CONCAT(F2.X, F.Y) = CONCAT(F2.Y, F.X)
)
GROUP BY F.X, F.Y HAVING COUNT(*)>=2 OR F.X < F.Y
ORDER BY F.X
그래서 마지막으로 접근한 방법은 두 개의 같은 테이블에서 각각의 값의 위치를 바꿔 비교했을 때 같을 때만 추출하고, 이를 다시 HAVING롤 마무리 해보는 것이다.
여기에 혹시나 X가 1이고 Y가 19 이면 X+Y는 119가 되는데 Y가 11 X가 9이면 Y+X 역시 119 가 되기 때문에 concat함수 사이에 '바(|)'를 넣어 줬다. 이렇게 하니 정상적으로 추출된다.
SELECT F.X, F.Y
FROM Functions F, Functions Temp_F
WHERE CONCAT(F.X,'|',F.Y) = CONCAT(Temp_F.Y,'|',Temp_F.X)
AND CONCAT(F.Y,'|',F.X) = CONCAT(Temp_F.X,'|',Temp_F.Y)
GROUP BY F.X, F.Y HAVING COUNT(*)>=2 OR F.X < F.Y
ORDER BY F.X
다만, CONCAT(F.X,'|',F.Y) = CONCAT(Temp_F.Y,'|',Temp_F.X)는 F.X = Temp_F.Y와 동일한 조건이기에 굳이 저렇게 쓰기보다는 풀이처럼 간단하게 다시 바꿔주었다.
'데이터 > SQL 문제풀이' 카테고리의 다른 글
HackerRank SQL - Print Prime Numbers (0) | 2023.02.21 |
---|---|
HackerRank SQL - Interviews (2) | 2023.02.13 |
HackerRank SQL - Placements (1) | 2023.02.05 |
HackerRank SQL - SQL Project Planning (2) | 2023.02.02 |
HackerRank SQL - Contest Leaderboard (0) | 2023.01.31 |
댓글