


1번 해설
-- 1) 사용자별 쿼리를 실행한 총 횟수를 구하는 쿼리를 작성해주세요. 단, GROUP BY를 사용해서 집계하는 것이 아닌 query_logs의 데이터의 우측에 새로운 컬럼을 만들어주세요.
SELECT
*,
-- 사용자별! => user
COUNT(*) OVER (PARTITION BY user) AS total_cnt
FROM advanced.query_logs
ORDER BY user, query_date
-- 로그 : 통나무에서 왔음. 히스토리, 기록.
-- 로그성 데이터 : 기록이 한줄에 하나씩(Row). RAW. 이벤트 데이터 > 어떤 유저가 무엇을 했다
-- 고객에게(유저에게) 노출을 하진 않음
-- 회사마다 다름. AWS라는 클라우드의 저장소(파일 저장소 - S3) -> 데이터 웨어하우스, 데이터베이스
-- Google Analytics 4, Firebase 플랫폼을 사용해서 데이터 저장하면 생기는 형태
-- 앱 로그, 웹 로그
-- 형태가 개발자가 어떻게 개발하냐에 따라서 그냥 못생긴 형태도 있음
-- 데이터 엔지니어가 Table 형태로 가공해서 줌
-- 데이터베이스 데이터 : 거래와 관련된 데이터.배민. 주문 데이터. 주문 목록
-- 데이터베이스 데이터가 많이 나올 것. Table
-- MySQL, PostgreSQL, Oracle
-- 1번 의도 : COUNT를 윈도우 함수로 쓸 수 있는가?
2번 해설
-- 2) 주차별로 팀 내에서 쿼리를 많이 실행한 수를 구한 후, 실행한 수를 활용해 랭킹을 구해주세요. 단, 랭킹이 1등인 사람만 결과가 보이도록 해주세요
-- 문제
-- 주차별로 뽑자 => EXTRACT(WEEK )
-- 랭킹을 구하자
-- 랭킹이 1인 것만 남기자
-- 1) 서브 쿼리 방식
-- SELECT
-- *
-- FROM (
-- SELECT
-- EXTRACT(WEEK FROM query_date) AS week,
-- team,
-- user,
-- COUNT(*) AS cnt
-- FROM advanced.query_logs
-- GROUP BY ALL
-- )
WITH base AS (
SELECT
EXTRACT(WEEK FROM query_date) AS week,
team,
user,
COUNT(*) AS cnt
FROM advanced.query_logs
GROUP BY ALL
)
-- 1-1. Qualify 사용법
-- SELECT
-- *,
-- RANK() OVER (PARTITION BY week, team ORDER BY cnt DESC) AS rk,
-- DENSE_RANK() OVER (PARTITION BY week, team ORDER BY cnt DESC) AS dense_rk
-- # 지금 데이터는 결과가 같다. 데이터의 형태에 따라서 다를 수 있음! DENSE : 하나씩 채운다
-- FROM base
-- QUALIFY rk=1
-- ORDER BY week, team, rk DESC
-- SELECT
-- *
-- FROM (
-- SELECT
-- *,
-- RANK() OVER (PARTITION BY week, team ORDER BY cnt DESC) AS rk,
-- DENSE_RANK() OVER (PARTITION BY week, team ORDER BY cnt DESC) AS dense_rk
-- # 지금 데이터는 결과가 같다. 데이터의 형태에 따라서 다를 수 있음! DENSE : 하나씩 채운다
-- FROM base
-- )
-- WHERE rk=1
-- ORDER BY week, team, rk DESC
-- 윈도우 함수를 쓰면 서브 쿼리를 많이 쓰게 됨
-- 쿼리를 길게 쓰면 안좋은 것이 아닌가요? : 쿼리는 길게 쓸 수 밖에 없는 언어
-- 우리가 중간으로 만들어야 하는 것 : WEEK | user | team | query_date | cnt
-- 최종적으로 만들 것 : WEEK | user | team | query_date | cnt | rk
-- rk = 1인 것만
-- COUNT 그냥 집계랑, 윈도우 COUNT를 언제 해야할까? 기준이 있을까?
-- 데이터의 형태에 맞게 적절하게 수정을 하는데, 최종적으로 보여줄 형태의 데이터에서
-- 하나의 Row 우측에 컬럼을 추가할 것인가? => 윈도우 함수
-- 한번 집계를 하고 그 결과의 우측에 컬럼을 붙여야 하는가? => 그 전에는 집계 함수, 그 후에 윈도우 함수
-- 윈도우 함수 => 중복이 생김. DISTINCT / GROUP BY 중복 제거
-- 의도 : 집계를 한번 하고, 윈도우 함수를 쓰는 것도 방법이다!