[SQL] WITH 쿼리

얼음꽃 ㅣ 2024. 9. 9. 11:55

728x90

DB 데이터에서 중복된 값들 을 group by 시켜서 가져와 그 중 desc를 쓰고 싶었으나...

 

group by 를 하게되면 항상 asc 형태를 가져와 원하는 값을 못사용 하는 경우가 있었습니다.

 

그래서 방법을 찾아보니 WITH 함수가 있다고 하더라구여!!

 

WITH 문법은 SQL에서 공통 테이블 표현식(CTE, Common Table Expression)을 정의하는데 사용됩니다. 이를 통해 복잡한 쿼리나 서브쿼리를 보다 간단하게 작성하고, 반복적으로 사용해야 하는 쿼리 부분을 재사용할 수 있습니다.

WITH new_data AS (
    SELECT column1, column2
    FROM table
    WHERE conditions
)
SELECT column1, column2
FROM new_data
WHERE other_conditions;

 

WITH를 이용해서 new_data라는 테이블을 만들고 그 테이블을 가지고 select 문을 진행 할 수 있다고 되어있습니다.

 

여기서 이제 제가 하고 싶었던건 group을 지어서 거기서 값을 이용하고 싶었던거라 방법은 다음과 같습니다.

 

WITH data AS (
    SELECT employee_id, sales_amount,
           ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY sales_date DESC) AS rn
    FROM sales
)
SELECT employee_id, sales_amount
FROM data
WHERE rn = 1;

 

여기서 보면 WITH 함수 안에 새로운 내용을 적은게 보이실텐데요

 

ROW_NUMBER() OVER (...) : SQL의 윈도우 함수로, 각 행에 순번을 매깁니다.

PARTITION BY employee_id : 직원별로 데이터를 분할합니다. 즉, 각 employee_id 그룹 내에서 순번이 매겨집니다.

ORDER BY sales_date DESC: 각 직원별로 sales_date를 기준으로 내림차순 정렬합니다. 따라서 가장 최신의 판매 기록에 ROW_NUMBER() 값이 1이 할당됩니다.

 

이렇게 되면 원하는 값을 최신 순으로 나열해서 1을 할당 한 후, 그 상태로 select를 해오면 됩니다.

 

위에 내용을 좀 더 자세하게 하면

 

employee_id sales_amount slaes_date
1 500 2024-08-01
1 200 2024-06-15
2 300 2024-07-10
2 100 2024-01-01

 

이라는 값이 존재하면 여기에 ROW_NUMBER() 부분을 똑같이 진행한 결과는 다음과 같습니다.

 

employee_id sales_amount sales_date rn
1 500 2024-08-01 1
1 200 2024-06-15 2
2 300 2024-07-10 1
2 100 2024-01-01 2

 

여기서 rn = 1인 값만 가져온거니 제가 필요한 데이터를 가져오게 된 것입니다.

 

WITH함수를 써서 이렇게 쉽게 값을 가져오는 방법이 있다니 신기했습니다.

728x90