Home mysql 쿼리 기능
Post
Cancel

mysql 쿼리 기능

윈도우 함수란?

행과 행 간의 관계를 정의하거나 계산할때 씀. 데이터를 그룹화하지 않고도 각 행을 유지하면서 추가적인 계산을 수행 특징으로는 GROUP BY와 다르게 행이 유지되고 OVER절을 써야하고 행간 순위, 누적합계 비교가 가능함.

LEAD

  • LEAD 함수는 현재 행을 기준으로 이후 행의 데이터를 가져오는 데 사용.
  • 주로 다음 행의 값과 현재 행의 값을 비교하거나, 다음 데이터의 예측값을 계산할 때 활용.
1
LEAD(<expression>[, offset[, default_value]]) OVER (PARTITION BY <expr> ORDER BY <expr>)
  • expression: 반환할 열(column) 값.
  • offset: 기준 행으로부터 몇 번째 이후 값을 가져올지 지정. 기본값은 1.
  • default_value: 이후 행이 없을 경우 반환할 기본값. 기본값은 NULL.
  • PARTITION BY: 데이터를 그룹화하여 각 그룹 내에서 별도로 계산.
  • ORDER BY: 행의 순서를 지정.

image

1
2
3
4
5
6
SELECT 
    customerName,
    orderDate,
    LEAD(orderDate, 1) OVER (PARTITION BY customerNumber ORDER BY orderDate) AS nextOrderDate
FROM orders
INNER JOIN customers USING (customerNumber);
  • 위의 이미지 처럼 각각의 고객별로 주문 날짜를 기준으로 정렬하고, 다음 주문 날짜를 조회가 필요할 때 사용

LAG

  • LAG 함수는 현재 행을 기준으로 이전 행의 데이터를 가져오는 데 사용
  • 주로 이전 값과 현재 값을 비교하거나 변화 추이를 계산할 때 활용
1
LAG(<expression>[, offset[, default_value]]) OVER (PARTITION BY <expr> ORDER BY <expr>)
  • 구문은 LEAD와 동일하지만 전 상태를 비교할때 씀
productlineorder_yearorder_valueprev_year_order_value
Classic Cars20221500000NULL
Classic Cars202316500001500000
Classic Cars202418000001650000
Vintage Cars2022800000NULL
Vintage Cars2023850000800000
Vintage Cars2024900000850000
Motorcycles2022600000NULL
Motorcycles2023650000600000
Motorcycles2024700000650000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH productline_sales AS (
    SELECT 
        productline,
        YEAR(orderDate) AS order_year,
        ROUND(SUM(quantityOrdered * priceEach), 0) AS order_value
    FROM orders
    INNER JOIN orderdetails USING (orderNumber)
    INNER JOIN products USING (productCode)
    GROUP BY productline, order_year
)
SELECT 
    productline,
    order_year,
    order_value,
    LAG(order_value, 1) OVER (PARTITION BY productline ORDER BY order_year) AS prev_year_order_value
FROM productline_sales;
  • 각 제품군(productline)의 연도별 매출액을 계산하고, 전년도 매출액(prev_year_order_value)을 비교할떄 씀

둘의 비교

기능LEADLAG
반환값현재 행 기준 이후 값현재 행 기준 이전 값
주요 목적미래 데이터 참조과거 데이터 참조
기본값NULLNULL
활용 예시다음 주문 날짜 조회전년도 매출액 비교

OVER

  • 윈도우 함수에서 반드시 사용되는 구문으로, 특정 범위를 정의해야함
  • ORDER BY를 통해 행의 순서를 지정하거나, PARTITION BY를 통해 그룹화된 데이터 내에서 연산을 수행할 수 있음.

PARTITION BY

  • 데이터를 특정 그룹으로 나누어 각 그룹 내에서 독립적으로 연산을 수행
  • PARTITION BY를 생략하면 전체 데이터셋에 대해 연산이 수행
employeeNamedepartmentsalaryrank_in_department
John SmithIT950001
Jane DoeIT920002
Mike JohnsonIT880003
Emily BrownIT850004
Sarah LeeSales1100001
Tom WilsonSales1050002
Lisa ChenSales980003
David KimSales950004
Mary TaylorHR880001
Robert WhiteHR850002
Anna GarciaHR820003
1
2
3
4
5
6
SELECT 
    employeeName,
    department,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_in_department
FROM employees;
  • 각 부서별로 직원들의 급여 순위를 계산 rank_in_department 구하기

This post is licensed under CC BY 4.0 by the author.