[SQL 레벨업] 12강 집약

2024. 1. 10. 01:34·BOOK/SQL 레벨업

12강 | 집약

정리

  1. 집약 함수
    • COUNT
    • SUM
    • AVG
    • MAX
    • MIN
  2. 여러 개의 레코드를 한 개의 레코드로 집약
    • CASE 식과 GROUP BY를 응용한다
      • CASE를 이용해 해당 레코드에 필요한 필드면 데이터를 반환 아니면 NULL을 반환
  3. 집약,해시,정렬
    • 집약시 경우에 따라 정렬 또는 해시를 사용한다.
    • 최근 Group By를 사용하는 집약에서 정렬보다 해시를 사용하는 경우가 많다
    • 해시 이용 : GROUP BY에서 지정한 필드를 해시함수로 해시 키로 변환한 후, 동일한 해시 키를 가진 그룹끼리 집약한다.
    • 정렬과 해시는 메모리를 만히 사용하므로, 충분한 해시용(정렬용) 워킹 메모리가 확보되지 않으면 스왑 발생

예제문제 1

data_type 별로 필요한 데이터 값을 구해야 한다. 이때 data_type이 A일때는 data_1과 data_2 값만 필요하며, B일때는 data_3과 data_4 값만이 필요하다

  • NonAggTbl 테이블

 

  • 테이블 생성 및 데이터 추가
//테이블 생성
CREATE TABLE NonAggTbl (
    id VARCHAR(50),
    data_type VARCHAR(1),
    data_1 INT,
    data_2 INT,
    data_3 INT,
    data_4 INT
);

//데이터 추가
INSERT INTO NonAggTbl (id, data_type, data_1, data_2, data_3, data_4) VALUES 
    ('Jim', 'A', 100, 10, 34, 346),
    ('Jim', 'B', 45, 2, 167, 77),
    ('Ken', 'A', 78, 5, 724, 457),
    ('Ken', 'B', 123, 12, 178, 346);

 

 

  • 집약을 이용한 문제 해결
SELECT id, 
	MAX(CASE WHEN data_type='A' THEN data_1 ELSE NULL END) AS data_1,
	MAX(CASE WHEN data_type='A' THEN data_2 ELSE NULL END) AS data_2,
	MAX(CASE WHEN data_type='B' THEN data_3 ELSE NULL END) AS data_3,
	MAX(CASE WHEN data_type='B' THEN data_4 ELSE NULL END) AS data_4
FROM NonAggTbl
GROUP BY id;

 

 

  • 결과

 

 

 

  • 실행 계획

“Using temporary”는 임시 테이블을 사용한다는 의미로, 정렬 또는 그룹화 수행에 사용한다.

 

 

 

 

 

 

예제문제 2

아래 테이블은 제품 대상 연령별 가격을 관리하는 테이블이다. 이때 모든 연령이 이용할 수 있는 제품을 찾아야 한다.

  • PriceByAge

 

 

  • 테이블 생성 및 데이터 추가
CREATE TABLE PriceByAge (
    product_id VARCHAR(50),
    low_age INT,
    high_age INT,
    price INT
);

INSERT INTO PriceByAge (product_id, low_age, high_age, price) VALUES 
    ('제품1', 0, 50, 2000),
    ('제품1', 51, 100, 3000),
    ('제품3', 0, 20, 500),
    ('제품3', 31, 70, 800),
    ('제품3', 71, 100, 1000);

 

 

  • 집약을 이용한 해결

각 대상 연령의 상한과 하한의 격차 합을 구했을 때, 100이 나와야 전 연령을 포함시킨 제품을 찾을 수 있다.

SELECT product_id
FROM PriceByAge
GROUP BY product_id
HAVING SUM(high_age-low_age+1) = 101;

 

  • 결과

제품3은 21부터 30까지의 연령을 포함하지 않음으로 제품1만 나온다.

 

 

 


아직 집약을 능숙하게 다루지 못하는 것 같다.. 절차지향적으로 생각하지 말고 구문을 식으로 생각하는 연습을 더 해야할 것 같다. (11강은 구문 기반에서 식 기반으로 생각하는 것이 중요하다는 내용이었습니다 ! 정리할 큰 내용이 없어서 스킵했습니다 ~)

'BOOK > SQL 레벨업' 카테고리의 다른 글

[SQL 레벨업] 15강 반복계의 공포  (1) 2024.01.25
[SQL 레벨업] 13강 자르기  (1) 2024.01.23
[SQL 레벨업] 10강 UNION이 필요한 경우  (1) 2024.01.04
[SQL 레벨업] 9장 집계와 조건분기  (0) 2023.12.13
[SQL 레벨업] 8강 UNION을 사용한 쓸데없이 긴 표현  (0) 2023.12.11
'BOOK/SQL 레벨업' 카테고리의 다른 글
  • [SQL 레벨업] 15강 반복계의 공포
  • [SQL 레벨업] 13강 자르기
  • [SQL 레벨업] 10강 UNION이 필요한 경우
  • [SQL 레벨업] 9장 집계와 조건분기
gani+
gani+
꾸준히 기록할 수 있는 사람이 되자 !
  • gani+
    Gani_Dev :)
    gani+
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • 당장 프로젝트 (2)
        • 트러블슈팅 (0)
      • 댕댕어디가 프로젝트 (11)
        • 트러블슈팅 (3)
        • MSA (8)
      • 개발일지 (2)
      • BOOK (12)
        • SQL 레벨업 (10)
      • 프로젝트 (0)
      • ELK (5)
      • 알고리즘 (9)
      • CS (2)
        • 디자인패턴 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    9095
    이것이코딩테스트다
    백준4963
    해쉬
    소마
    이것이 코딩 테스트다
    섬의개수
    다이나믹프로그래밍
    완전탐색
    4963
    후기
    14기
    dfs
    이진탐색
    다익스트라
    정렬
    SWMaestro14
    4673
    최단경로
    순차탐색
    SW마에스트로
    플로이드워셔
    알고리즘
    DP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gani+
[SQL 레벨업] 12강 집약
상단으로

티스토리툴바