SQL, having, distinct
데이터 필터링 기능을 가진 having, where절과의 차이는?
where - group by 전 데이터 기준
having - group by 후 결과값 기준
서브쿼리를 쓰지 않고도 조건을 줄 수 있어 유용
조건1) 서버별, 월별 게임계정id 수를 중복값 없이 추출해주세요. 월은 첫 접속일자를 기준으로 계산해주세요. 월은 yyyy-mm의 형태로 추출해주세요.
SELECT serverno,
left(first_login_date, 7) as m,
count(distinct game_actor_id) as usercnt
from marketer_sql_users
group by serverno, m ;
조건1) group by 를 활용하여 첫 접속일자별 게임캐릭터수를 중복값 없이 구하고,
조건2) having 절을 사용하여 그 값이 10개를 초과하는 경우의 첫 접속일자 및 게임캐릭터id 개수를 추출해주세요.
select first_login_date,
count(distinct game_actor_id) as actor_cnt
from marketer_sql_users
group by 1
having actor_cnt>10;
조건1) group by 절을 사용하여 서버별, 유저구분(기존/신규) 게임캐릭터id수를 구해주세요. 중복값을 허용하지 않는 고유한 갯수로 추출해주세요.
조건2) 기존/신규 기준→ 첫 접속일자가 2024-01-01 보다 작으면(미만) 기존유저, 그렇지 않은 경우 신규유저
조건3) 또한, 서버별 평균레벨을 함께 추출해주세요.
select serverno,
case when first_login_date<'2024-01-01' then '기존유저'
else '신규유저'end as gb,
count(distinct game_actor_id) as actor_cnt,
avg(level) as avg_level
from marketer_sql_users
group by 1,2;
조건1) 문제2번을 having 이 아닌 인라인 뷰 서브쿼리를 사용하여 추출해주세요.
힌트: 인라인 뷰 서브쿼리는 from 절 뒤에 위치하여, 마치 하나의 테이블 같은 역할을 했었습니다!
select first_login_date,
actor_cnt
from (
select first_login_date,
count(distinct game_actor_id) as actor_cnt
from marketer_sql_users
group by 1) a
where actor_cnt>10;
조건1) 레벨이 30 이상인 캐릭터를 기준으로, 게임계정 별 캐릭터 수를 중복값 없이 추출해주세요.
조건2) having 구문을 사용하여 캐릭터 수가 2 이상인 게임계정만 추출해주세요.
조건3) 인라인 뷰 서브쿼리를 활용하여 캐릭터 수 별 게임계정 개수를 중복값 없이 추출해주세요.
SELECT actor_cnt,
count(distinct game_account_id) as accnt
from
(select game_account_id,
count(distinct game_actor_id) as actor_cnt
from marketer_sql_users
where level>=30
group by game_account_id
having actor_cnt>=2
)a
group by actor_cnt;
5번 문제 중...
SELECT actor_cnt,
count(distinct game_account_id) as accnt
from
(select game_account_id,
count(distinct game_actor_id) as actor_cnt
from marketer_sql_users
where level>=30
group by game_account_id
having actor_cnt>=2
)a
group by actor_cnt;
첫번째 의문. distinct를 넣든 넣지 않든 결과값이 같게 나오는 이유는?
: 서브쿼리에서 이미 group by game_account_id를 해줬기 때문에 외부 커리 count에 distinct를 굳이 넣지 않아도 결과값이 같다!
⭐️ tip
GROUP BY를 쓴 이후
집계 대상 컬럼이 그룹 기준과 다르면, DISTINCT가 필요할 수 있음
집계 대상 컬럼이 그룹 기준과 동일한 경우, DISTINCT는 보통 불.필.요
두번째 의문. 그렇다면 distinct를 넣고 풀었을 때와 안넣고 풀었을 때 결과값은 같지만 순서는 다르게 출력되는 이유가 뭘까?
: order by 절이 없기 때문에 결과 정렬 기준이 명확하지 않기 때문!! 정렬까지 원하는대로 통제하고 싶다면 order by를 명시할 것.
세번째 의문. left outer join과 left join의 차이는?
줄임말일 뿐! 결과는 같다.
정화 매니저님과 짧지만 유익한 상담을 통해, 학습 방향을 잡을 수 있었다.
SQL 강의 완강하고 피그마로 넘어가서 듣고 있었는데, Python을 2순위로 잡고 다시 공부 계획을 짜야 할 것 같다.
SQL과 Python을 왜 배우는지 다시금 깨달았다.
"Python과 SQL은 '코딩을 잘하기 위해' 배우는 것이 아니라, 'GA4를 포함한 다양한 마케팅 도구를 제대로 활용하고, 데이터를 해석할 수 있는 눈을 키우기 위해' 배우는 것"
Python 강의 시작
SQL 연습 문제 지속적으로 꾸준히 풀어나갈 것!