DB/SQL 예제

[SQL예제][PostreSQL] 1. 데이터 조회 및 필터링(MAX(), ORDER BY, LIMIT, DISTINCT, OVER())

키세스라고 2023. 3. 3. 15:40

PAYMENT 테이블에서 단일 거래의 AMOUNT의 액수가 가장 많은 고객들의 CUSTOMER_ID를 추출하라. 단, CUSTOMER_ID의 값은 유일해야 한다.

PAYMENT 테이블 컬럼
SELECT * FROM PAYMENT


# 풀이 순서

  1. 가장 큰 AMOUNT 값을 찾는다.
  2. WHERE 를 통해 가장 큰 AMOUNT 갖는 단일 거래들을 찾는다.
  3. 조회한 거래에서 CUSTOMER_ID 의 중복을 제거하여 고객 명단을 뽑느다.

# 문제 풀이

 

1. 가장 큰 AMOUNT 찾기

 

a) max() 사용

SELECT MAX(P2.AMOUNT)
FROM PAYMENT P2

MAX()

 

b) order by, limit 사용

SELECT P2.AMOUNT
FROM PAYMENT P2
ORDER BY P2.AMOUNT DESC
LIMIT 1

ORDERY BY
LIMIT

2. 가장 큰 AMOUNT 를 가지는 단일 거래들 찾기 + CUSTOMER_ID 중복 제거

 

a) 서브쿼리 사용

SELECT DISTINCT P.CUSTOMER_ID
FROM PAYMENT P 
WHERE P.AMOUNT = (SELECT MAX(P2.AMOUNT)
                  FROM PAYMENT P2)
ORDER BY P.CUSTOMER_ID

DISTINCT

 

b) 위 방법은 PAYMENT 테이블을 두 번 조회한다. 는 내용이 있어서 아래와 같이 작성함

SELECT DISTINCT CUSTOMER_ID
FROM (SELECT CUSTOMER_ID, AMOUNT, MAX(AMOUNT) OVER() AS MAXAMOUNT
      FROM PAYMENT) P 
WHERE AMOUNT = P.MAXAMOUNT
ORDER BY CUSTOMER_ID

OVER()