SQL을 이용한 간단한 피벗 예제 코드

가령 로그 필드에 날짜(created_at)와 IP(client_ip)가 있는데, 전체 로그 수 기준으로 정렬하면서 각 호스트(row)와 일자(column)별로 통계 테이블을 출력해서 보고 싶다고 하자.

아래는 PostgreSQL용으로 만들어진 쿼리다. (다른 DB에서도 CASE는 보통 지원하니까 쉽게 될 것이다.)

SELECT w.host, SUM(w.d1) AS d1, SUM(w.d2) AS d2, SUM(w.d3) AS d3, SUM(w.d4) AS d4, SUM(w.d5) AS d5
FROM
(
  SELECT client_ip AS host, 
  CASE date(created_at) WHEN '2010-05-30' THEN count(*) ELSE 0 END AS d1,
  CASE date(created_at) WHEN '2010-05-29' THEN count(*) ELSE 0 END AS d2,
  CASE date(created_at) WHEN '2010-05-28' THEN count(*) ELSE 0 END AS d3,
  CASE date(created_at) WHEN '2010-05-27' THEN count(*) ELSE 0 END AS d4,
  CASE date(created_at) WHEN '2010-05-26' THEN count(*) ELSE 0 END AS d5
  FROM ml_log_web
  WHERE created_at >= date(current_date - interval '5 day') and created_at <= date(current_date - interval '1 day') + interval '23 hour 59 min 59 sec'
  GROUP BY client_ip, date(created_at)
) w
GROUP BY w.host 
ORDER BY SUM(w.d1) + SUM(w.d2) + SUM(w.d3) + SUM(w.d4) + SUM(w.d5) DESC;

이렇게 CASE로 일단 열을 분류한 다음에 빈 공간은 SUM해서 없애버리면 된다.
EXPLAIN 해보면 인덱스 타고 Hash Aggregate한 다음 Sort 하는 것 볼 수 있음..

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://www.xeraph.com/tb/5281958 [도움말]

덧글

댓글 입력 영역