DB/postgres

postgresql - dvdrental 실습(2)

@예민한 방구석여포 힘히힘 2021. 2. 24. 16:26
반응형

*패캠 수강중입니다*

 

-----실습2.-----
RENTAl과 CUSTOMER 테이블을 이용하여 현재까지 가장 많이 RENTAL을 한 고객의 고객 ID, 랜탈순위, 누적랜탈횟수, 이름을 출력하라.

 

 

SELECT
	a.customer_id 고객아이디
	,ROW_NUMBER() OVER (ORDER BY count(a.rental_id) desc) AS 랜탈순위
	,count(*) 횟수
 FROM rental a
GROUP BY a.customer_id
ORDER BY count(*) DESC;

 

 

 

 

 

--단 한사람 뽑기--

SELECT 
	  a.customer_id
	  ,ROW_NUMBER () OVER (ORDER BY count(a.rental_id) DESC) AS rental_rank
	  ,count(*)
	FROM rental a
GROUP BY a.customer_id
ORDER BY rental_rank
LIMIT 1
;

 

 

 

 

 

--이름까지 출력하라--

 

 

결과는 모두 동일함!

 

방법1.

SELECT 
	  a.customer_id
	  ,ROW_NUMBER () OVER (ORDER BY count(a.rental_id) DESC) AS rental_rank
	  ,count(*)
	  ,b.first_name 
	  ,b.last_name 
	FROM rental a,
	     customer b
	WHERE a.customer_id =b.customer_id 
GROUP BY a.customer_id, b.first_name, b.last_name
ORDER BY rental_rank
LIMIT 1
;

 

 

 

 

select에 집계함수가 없는 것들을 group by에 함께 적어주어 처리해준다.

 

 

 

 

방법2.

SELECT 
	  a.customer_id
	  ,ROW_NUMBER () OVER (ORDER BY count(a.rental_id) DESC) AS rental_rank
	  ,count(*)
	  ,max(b.first_name) AS first_name
	  ,max(b.last_name) AS last_name
	FROM rental a,
	     customer b
	WHERE a.customer_id =b.customer_id 
GROUP BY a.customer_id 
ORDER BY rental_rank
LIMIT 1
;

 

 

 

 

group by 에서 집계함수가 아닌 것들을 처리를 안해주면 위에 있는 select 아이들은 집계함수로 바꿔주는 작업이 필요!

 

 

select의 b.first_name이나 last_name 모두 inner 조인으로 1대 1이라고 생각하여 중복이 없다고 생각하고,

limt로 제일 높은 한순위만 뽑기 때문에

 

이미 name들은 한 값들만 가지게 됨.

 

max를 쓸수 있을까?? 

어차피 1등인 고객을 뽑음, 특정 고객이 가지고 있는 이름은 하나다!  max, min 무관으로 사용가능하다.

 

 

 

방법3.

SELECT a.customer_id, a.rental_rank, a.rental_count, b.first_name, b.last_name 
FROM (
         SELECT  a.customer_id
	             ,ROW_NUMBER () OVER (ORDER BY count(a.rental_id) DESC) AS rental_rank
	             ,count(*) rental_count
		 FROM rental a
         GROUP BY a.customer_id 
         ORDER BY rental_rank
         LIMIT 1
       ) a, customer b
WHERE a.customer_id =b.customer_id 
;

 

 

 

서브쿼리를 사용하여 그곳에서 집계 함수를 처리하여 주고 그 안에서 데이터 뽑아오기

 

 

 

 

 

 

 

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

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
postgresql - dvdrental 실습(1) (Roll-up)  (0) 2021.02.24