Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

leet code sql 608

leet code sql 608
문제

  • 각 노드 별 Parent 정보가 주어진다.
  • 각 Node가 Root, Leaf, Inner인지 구별하여 출력
  • 순서는 상관 없다.
문제 접근

  • Root인 경우 = parent_id가 null 인 경우
  • Leaf인 경우 = parent_id가 null 인 경우
  • Inner = 나머지 경우
  • 이 때 각 노드에 해당되는 값을 알기 위해 Left join 활용
  • Distinct vs Group by
    • Distinct는 그룹핑만
    • Group by는 그룹핑 + 정렬 과정
1
2
3
4
5
6
7
8
9
a.id,
    case when a.p_id is null then 'Root'
        when b.p_id is null then 'Leaf'
        else 'Inner'
        end as type
from Tree a
left join Tree b
    on a.id = b.p_id
group by 1, 2

신박하게 푼 사람의 아이디어를 가져와보았다.

if ( 조건, 성공한 경우, 실패한 경우) 를 활용하여 위의 경우를 표현

하지만, 속도 측면에서는 매우 느렸다.. 빠르다고 된건지 모르곘다.

1
2
3
4
select 
    distinct t.id, 
    if(t.p_id is null,'Root',if(t.id=p.p_id,'Inner','Leaf')) as type 
from tree t left join tree p on t.id=p.p_id;