DB/postgres

postgresql - dvdrental 실습(5)

@예민한 방구석여포 힘히힘 2021. 3. 10. 16:31
반응형

참고: 패스트 캠퍼스~~~~ 패스트 캠퍼스~~~~

 

 

 

--dvd렌탈 시스템의 관리자는 매달 마다 매출 순위 1위를 한 고객에게 특별한 선물을 주고자 한다. 이러한 업무를 달성 하기 위해서
--CUSTOMER_RANK_YYYYMM이라는 테이블을 CTAS 기법으로 생성하는 SQL 문을 작성하라. 🙌🙌🙌🙌

(단, 선물 제공 기준을 정하기 위해 SUM_AMOUNT도 저장하라)

 

 

문제 푸는 순서.

 

1️⃣ 우선 payment 테이블은 customer_id, yyyymm 기준으로 group by gksgn amount 의 합계를 구한다.

2️⃣ 1번에 추출한 집합을 인라인뷰로 감싸서 yyyymm을 기준으로 amount 합계 별 순위를 구한다.

 

-> 인라인 뷰 사용할 때는 안에 넣은 집합을 먼저 돌려보면 쉽게 작업 할 수 있음!!

 

3️⃣ CTAS 문을 이용하여 최종적으로 테이블 생성 및 데이터를 입력한다.

 

 

 


1️⃣

SELECT

          c.customer_id

          ,sum(p.amount) AS sum_amount
  FROM customer c JOIN payment p
    ON c.customer_id=p.customer_id 
    GROUP BY c.customer_id;

 

 

 SELECT 

          a.customer_id

          ,sum(a.amount) AS sum_amount
 FROM 

           payment a
 GROUP BY 

           a.customer_id 

 

 

 

 

 

 SELECT 
              a.customer_id
              ,to_char(payment_date,'yyyymm') AS yyyymm , sum(a.amount)
              ,SUM(a.amount) AS sum_amount
 FROM 
              payment a
 GROUP BY
              a.customer_id
              ,to_char(payment_date,'yyyymm')

 

 

 

 

2️⃣

SELECT a.customer_id , a.yyyymm, a.sum_amount
           ,ROW_NUMBER() over(PARTITION BY a.yyyymm ORDER BY a.sum_amount desc) AS rank_yyyymm
   FROM 
           (
             select
                     a.customer_id
                     ,to_char(payment_date,'yyyymm') AS yyyymm , sum(a.amount)
                     ,SUM(a.amount) AS sum_amount
             FROM 
                      payment a
             GROUP BY
                       a.customer_id
                       ,to_char(payment_date,'yyyymm')
              ) a
ORDER BY yyyymm, rank_yyyymm;

 

 

 

3️⃣

테이블 생성해주기.

CREATE TABLE customer_rank_yyyymm AS
SELECT a.customer_id, a.yyyymm, a.sum_amount,
row_number() OVER(PARTITION BY a.yyyymm ORDER BY a.sum_amount desc) AS rank_yyyymm
 FROM 
 (
 select
  a.customer_id
  ,to_char(payment_date,'yyyymm') AS yyyymm , sum(a.amount)
  ,SUM(a.amount) AS sum_amount
 FROM 
         payment a
 GROUP BY
  a.customer_id
  ,to_char(payment_date,'yyyymm')
) a
ORDER BY yyyymm, rank_yyyymm;

 

 

 

 

SELECT * FROM customer_rank_yyyymm
WHERE rank_yyyymm IN (1,2,3);

 

돌리면, 

 

굉장히 중요한 부분이므로 다시 복습할 필요 ✔✔

 

 

'DB > postgres' 카테고리의 다른 글

postgresql - dvdrental 실습(7) : Cartesian Product  (0) 2021.03.24
postgresql - dvdrental 실습(6)  (0) 2021.03.11
postgresql - dvdrental 실습(5)  (0) 2021.03.10
postgresql - dvdrental 실습(4)  (0) 2021.03.09
postgresql - dvdrental 실습(3)  (0) 2021.02.25
postgresql - dvdrental 실습(2)  (0) 2021.02.24
1 2 3 4 5 6 7 8