image.png

image.png

image.png


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 중복 제거

-- 의도 : 집계를 한번 하고, 윈도우 함수를 쓰는 것도 방법이다!