SQL 문제풀이 복습
문제 링크
간단한 case when 문제.
사실 case when을 아는 것보다도
삼각형의 성립 조건을 아는 것이 더 중요하다;;
SELECT CASE
WHEN A >= ( B + C )
OR B >= ( A + C )
OR C >= ( A + B ) THEN 'Not A Triangle'
WHEN A = B
AND B = C THEN 'Equilateral'
WHEN A <> B
AND B <> C
AND A <> C THEN 'Scalene'
ELSE 'Isosceles'
end AS "triangle_type"
FROM Triangles;
문제 링크
위와 똑같이 case when을 활용하는 문제지만
중간에 서브쿼리가 하나 들어가는 것이 차이점.
N에는 null인 경우가 없고 + N이 P에 속해있으면 Inner,
즉 부모도 있고 자식도 있는 경우에 해당한다.
P가 null, 즉 부모가 없으면 Root,
그 외의 나머지 경우는 Leaf에 해당.
case when을 써서 모든 행들을 분류할 때는
확실한 것들을 먼저 써 놓고 나머지들을 else로 묶어서 계산하는 게
머리 안 아프고 좋은 듯. 만약 Leaf를 식별하기 위해
Tree끼리 셀프 조인했으면 더 복잡해졌을 것이다.
SELECT N,
CASE
WHEN P IS NULL THEN 'Root'
WHEN N IN (SELECT DISTINCT P
FROM Tree) THEN 'Inner'
ELSE 'Leaf'
end AS "Type"
FROM Tree
ORDER BY 1;
문제 링크
window함수 중 percent_rank를 써서 해결하면 간단한 문제.
percent_rank는 partition by 뒤에 있는 인자를 기준으로
백분위로 알아서 변환해 준다.
예를 들어 서브쿼리 부분만 따로 실행시키면 아래와 같은 결과가 나온다.
Florida의 경우 행이 5개 있으므로,
0부터 1까지 5단계로 끊어져서 표시되는 것을 확인할 수 있다.
이 ranking_per가 5%, 즉 0.05 이내로 들어와야 하므로
본 쿼리에서는 where절을 넣어서 ranking_per <= .05로 쓰면 됨.
SELECT policy_id,
state,
fraud_score
FROM (SELECT policy_id,
state,
fraud_score,
PERCENT_RANK()
OVER(
partition BY state
ORDER BY fraud_score DESC) AS "ranking_per"
FROM Fraud) result
WHERE ranking_per <= .05
ORDER BY 2,
3 DESC,
1;