PS 공부 기록

프로그래머스 SQL 고득점 Kit 3/6 : GROUP BY

정글러 2022. 3. 31. 14:00

 

group by 후 count로 각 column의 row 수 카운트

select ANIMAL_TYPE, count(ANIMAL_TYPE)
from ANIMAL_INS
group by ANIMAL_TYPE
# order by ANIMAL_TYPE

 

having {boolean}으로 group 내에서 조건 필터링

select NAME, count(NAME)
from ANIMAL_INS
group by NAME
having NAME is not null and count(NAME) >= 2
order by NAME

where > group은 필터링 후 필터링된 row들에 대해 group하고,

group > having은 필터링되지 않은 전체 row들에 대해 group 후 필터링

예제에선 연습이니 having을 썼지만 전자의 효율이 더 좋다.

group에 종속적이지 않은 필터링은 미리 where로 하는 것이 좋은 습관이 될 것 같다.

 

datetime type에서 hour를 추출하는 hour()함수

select hour(DATETIME) HOUR, count(DATETIME) COUNT
from ANIMAL_OUTS
group by hour(DATETIME)
having HOUR >= 9 and HOUR < 20
order by HOUR

select문 내에서 as {col} 선언시 select된 column을 {col}로 취급한다. as는 생략 가능

hour(DATETIME) as HOUR 선언에 의해

hour(DATETIME)으로 group한 뒤 실행되는 having문 내에서는 HOUR로 대체할 수 있다.

 

where hour(DATETIME) >= 9 and hour(DATETIME) < 20
#error # where HOUR >= 9 and HOUR < 20

having 대신 where문으로 group by hour(DATETIME) 이전에 필터링 진행시에는,

hour(DATETIME)에 의한 그룹화가 이뤄지지 않았으므로 HOUR를 column명으로 하는 필터링이 불가능하다.

 

set @{var_name} := {init_value}; 를 이용한 로컬 변수 선언

및 이를 이용한 로컬 column 생성

set @hour := -1;

select (@hour := @hour + 1) HOUR, (
    select count(*)
    from ANIMAL_OUTS
    where hour(DATETIME) = @hour
) COUNT    
from ANIMAL_OUTS
where @hour < 23

초기값 -1에서 row마다 +=1되는 @hour를 as HOUR,

그 hour에 대해 table에서 hour(DATETIME)이 @hour인 row를 count한 데이터를 as COUNT

함으로써 0~23시에 대해 {HOUR, COUNT} 쌍의 데이터를 추출할 수 있다.

 

변수선언까지 하니까 정말 코딩하는것같다.