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} 쌍의 데이터를 추출할 수 있다.
변수선언까지 하니까 정말 코딩하는것같다.
'PS 공부 기록' 카테고리의 다른 글
프로그래머스 SQL 고득점 Kit 5/6 : JOIN (0) | 2022.03.31 |
---|---|
프로그래머스 SQL 고득점 Kit 4/6 : IS NULL (0) | 2022.03.31 |
프로그래머스 SQL 고득점 Kit 2/6 : SUM, MAX, MIN (0) | 2022.03.31 |
프로그래머스 SQL 고득점 Kit 1/6 : SELECT (0) | 2022.03.31 |
Week 10 알고리즘 공부 기록 [아호코라식, hospital-resident assignment problem] (0) | 2022.01.16 |