본문 바로가기

코딩스터디

LEETCODE SQL : Group by

1. Queries Quality and Percentage 문제 정리

문제 설명

  • Queries 테이블에서 query_name별로 데이터를 그룹화하고, 다음 값을 구해야 함.
    1. quality: (rating / position) 값의 평균
    2. poor_query_percentage: rating < 3인 데이터의 비율(%) 계산
  • 결과는 소수점 두 자리까지 반올림

SQL 코드

SELECT
  query_name,
  ROUND(AVG(rating / position), 2) AS quality,
  ROUND(SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) AS poor_query_percentage
FROM Queries
GROUP BY query_name;

예제 설명

 

  • quality 계산: ((5/1) + (5/2) + (1/200)) / 3 = 2.50
  • poor_query_percentage 계산: (1/3) * 100 = 33.33

2. Daily Leads and Partners 문제 정리

문제 설명

  • DailySales 테이블에서 특정 날짜(date_id)와 제조사(make_name)별로 고유한 lead_id와 partner_id 개수를 구해야 함.

SQL 코드

SELECT
  date_id,
  make_name,
  COUNT(DISTINCT lead_id) AS unique_leads,
  COUNT(DISTINCT partner_id) AS unique_partners
FROM DailySales
GROUP BY date_id, make_name;

예제 설명

 

  • toyota (2020-12-8): 고유한 lead_id = {0,1}, 고유한 partner_id = {0,1,2}
  • toyota (2020-12-7): 고유한 lead_id = {0}, 고유한 partner_id = {1,2}
  • honda (2020-12-8): 고유한 lead_id = {1,2}, 고유한 partner_id = {1,2}
  • honda (2020-12-7): 고유한 lead_id = {0,1,2}, 고유한 partner_id = {1,2}

3. 핵심 SQL 개념 정리

집계 함수(Aggregate Functions)

함수 설명

COUNT(*) 전체 행 개수
COUNT(column_name) NULL 제외한 특정 컬럼 개수
COUNT(DISTINCT column_name) 중복을 제외한 고유한 값 개수
AVG(column_name) 평균값 계산
SUM(column_name) 합계 계산
ROUND(value, 2) 소수점 2자리 반올림

GROUP BY를 활용한 요약

  • 특정 컬럼(예: query_name, date_id)을 기준으로 그룹화한 후, 각 그룹별로 집계 연산 수행
  • 예제:
    SELECT query_name, COUNT(*) AS total_queries
    FROM Queries
    GROUP BY query_name;
    

COUNT vs SUM + CASE WHEN

방법 코드 특징

COUNT(CASE WHEN 조건 THEN 1 END) COUNT(CASE WHEN rating < 3 THEN 1 END) NULL을 자동으로 제외하므로 ELSE 0 불필요
SUM(CASE WHEN 조건 THEN 1 ELSE 0 END) SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END) 모든 행을 포함해야 할 경우 사용

ELSE 0을 안 쓰는 이유

  • COUNT(CASE WHEN ...)에서 ELSE 0을 추가하면 0도 개수에 포함될 수 있어 의도치 않은 값이 나올 수 있음.
  • SUM(CASE WHEN ...)을 사용할 경우에는 ELSE 0을 추가해야 전체 합이 정확하게 계산됨.

4.  정리

집계 함수 요약 COUNT, AVG, SUM 등을 사용해 데이터를 한 줄로 요약 SELECT COUNT(*) FROM Queries;
GROUP BY를 사용한 데이터 요약 특정 기준(예: query_name, date_id)으로 그룹화하여 집계 수행 GROUP BY query_name
COUNT에서 ELSE 0을 안 쓰는 이유 COUNT는 NULL을 자동으로 제외하므로 필요 없음 COUNT(CASE WHEN rating < 3 THEN 1 END)
SUM에서 ELSE 0을 쓰는 이유 SUM은 모든 행을 포함하므로 0을 명시적으로 지정해야 함 SUM(CASE WHEN rating < 3 THEN 1 ELSE 0 END)

 

728x90