LAG 함수

LAG 함수

Apache Pinot의 LAG 윈도우 함수는 같은 결과 집합에서 지정한 물리적 오프셋만큼 앞의 행 값을 반환해요. 현재 행의 값을 이전 행의 값과 비교할 때 유용해요.

출처: 문서

본문

LAG 함수는 같은 결과 집합에서 지정한 물리적 오프셋만큼 앞에 있는 행에서 값을 반환해요. 현재 행의 값을 이전 행의 값과 비교하는 데 쓸 수 있어요.

시그니처

LAG(any expression [, bigint offset [, any default]]) [IGNORE NULLS | RESPECT NULLS] OVER (...)

인자

  • expression: 값을 반환할 컬럼 또는 계산.
  • offset: 현재 행 이전 몇 행 앞에서 값을 가져올지. 지정하지 않으면 기본값은 1.
  • default: 오프셋이 윈도우 범위를 벗어날 때 반환할 값. 지정하지 않으면 NULL이 반환됨.

null 처리

Pinot이 오프셋을 셀 때 null 표현식 값을 건너뛰게 하려면 LAG 호출 뒤에 IGNORE NULLS를 사용하세요. null 값을 포함해 세려면 RESPECT NULLS를 사용하는데, 이것이 기본 동작이에요.

IGNORE NULLS가 요청한 오프셋에서 앞쪽 null이 아닌 값을 찾지 못하면 Pinot은 선택적인 default 값을 반환하고, default가 지정되지 않았으면 NULL을 반환해요.

SELECT
    sales_date,
    sales_amount,
    LAG(sales_amount) IGNORE NULLS OVER (ORDER BY sales_date) AS previous_non_null_sales
FROM daily_sales;

예시

이 예시는 현재 날짜와 이전 날짜 사이의 매출 차이를 계산해요.

다음 결제 금액을 예상해 예산을 계획해요.

현재 데이터와 과거 데이터를 비교해 추세를 식별해요.

현재 날짜와 이전 날짜의 매출 차이 계산하기 이 예시는 LAG 함수로 연속된 날짜 사이의 매출 차이를 찾는 방법을 보여줘요.

SELECT
    sales_date,
    sales_amount,
    LAG(sales_amount, 1) OVER (ORDER BY sales_date) AS previous_day_sales,
    sales_amount - LAG(sales_amount, 1) OVER (ORDER BY sales_date) AS difference
FROM
    daily_sales;

출력:

sales_date sales_amount previous_day_sales difference
2023-02-14 200 NULL NULL
2023-02-15 180 200 -20
2023-02-16 220 180 40

비교를 위한 이전 결제 금액 가져오기 이 쿼리는 각 결제의 마지막 결제 금액을 가져와 금액이 증가하는지 감소하는지 확인해요.

SELECT
    payment_date,
    amount,
    LAG(amount, 1) OVER (ORDER BY payment_date) AS previous_amount
FROM
    payment;

출력:

payment_date amount previous_amount
2023-02-14 21:21:59.996577 2.99 NULL
2023-02-14 21:23:39.996577 4.99 2.99
2023-02-14 21:29:00.996577 4.99 4.99

현재 데이터와 과거 데이터를 비교해 추세 식별 LAG 함수로 현재 월의 데이터를 작년 같은 달과 비교해 추세나 중요한 변화를 식별해요.

SELECT
    month,
    year,
    data_value,
    LAG(data_value, 12) OVER (ORDER BY year, month) AS previous_year_data
FROM
    monthly_data;

출력:

month year data_value previous_year_data
1 2023 150 NULL
1 2024 170 150

CTE와 함께 사용:

WITH tmp AS (
  select count(*) as num_trips,
    DaysSinceEpoch
  from airlineStats
  GROUP BY DaysSinceEpoch
)

SELECT DaysSinceEpoch,
  num_trips,
  LAG(num_trips, 2) OVER (
    ORDER BY DaysSinceEpoch
  ) AS previous_num_trips,
  num_trips - LAG(num_trips, 2) OVER (
    ORDER BY DaysSinceEpoch
  ) AS difference
FROM tmp;

더 알아보기 (Learn more)