2023. 4. 6. 00:38ㆍ공부/SQL
Problem
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.
문제 해결에 앞서서 Symmetric Pairs 두 개의 쌍이 서로를 대칭적으로 갖는 관계를 말합니다. 예를 들어, (a, b)와 (b, a)는 서로를 대칭적으로 갖는 symmetric pairs입니다.
주의 할 점
1. x=y 이라면, Sample Input의 첫번째 row같은경우, x=20,y=20인 row가 하나 더 존재해야 symmetric pairs 를 만족한다.
2. 3번째 row와 6번째 row를 보면 (20, 21) 쌍과 (21, 20)은 완벽하게 symmetric pairs 이지만 원하는 output에는 20, 21만 출력되길 원한다. 중복의 제거가 필요하다.
Solution
쉬운것 먼저.. 풀어보자
ORDEY BY는 간단하게 x로 하면 될것 같다.
그리고.. 중복을 제거하기 위해서 WHERE 절을 사용하면 좋을 것 같다.
ex) (20, 21) , (21,20) 인 경우 우리가 필요한것은 (20,21) 이니까 where x<y 조건문을 넣어주면 (20,21) 짝만 출력될듯
Inner Join으로 해결하는 방식이 더 익숙해서 요렇게 써봤다.
SELECT f1.x, f1.y
FROM Functions f1
INNER JOIN Functions f2
ON f1.x = f2.y AND f1.y=f2.x
WHERE f1.x<f1.y
ORDER BY f1.x ASC;
이 경우엔 x=y인 경우를 제외시켜버려서 문제가 발생했다.
UNION을 통해서 x=y인 경우도 추가하면 해결이 될것 같음.
SELECT f1.x, f1.y
FROM Functions f1
INNER JOIN Functions f2
ON f1.x = f2.y AND f1.y = f2.x
WHERE f1.x < f1.y
UNION
SELECT f3.x, f3.y
FROM (
SELECT x, y, COUNT(*) cnt FROM Functions
GROUP BY x, y
) f3
WHERE f3.y = f3.y AND f3.cnt >= 2
ORDER BY x;
Union 을 사용하지 않고 subquery 와 if 조건문으로 해결하는 방법이있다고 하는데.. 이건 공부를 좀 더 한 뒤에 해결해 보겠다.
'공부 > SQL' 카테고리의 다른 글
[SQL] PROGRAMMERS - 즐겨찾기가 가장 많은 식당 정보 출력 <GROUP BY, SUBQUERY> (0) | 2023.04.07 |
---|---|
[SQL] Programmers - 조건에 부합하는 중고거래 댓글 조회 <INNER JOIN, WHERE, DATE_FORMAT> (0) | 2023.04.07 |
[SQL] Hackerrank - Placements (0) | 2023.04.05 |
[SQL] HackerRank - Project Planning (0) | 2023.04.05 |
[SQL] Hackerrank - Binary Tree Nodes (0) | 2023.04.02 |