LEAD 함수
LEAD 함수
Apache Pinot의 LEAD 윈도우 함수는 같은 결과 집합에서 지정한 물리적 오프셋만큼 뒤의 행 값을 반환해요. 현재 행의 값을 그다음 행의 값과 비교할 때 유용해요.
출처: 문서
본문
LEAD 함수는 같은 결과 집합에서 지정한 물리적 오프셋만큼 뒤에 있는 행에서 값을 반환해요. 현재 행의 값을 이후 행의 값과 비교하는 데 쓸 수 있어요.
시그니처
LEAD(any expression [, bigint offset [, any default]]) [IGNORE NULLS | RESPECT NULLS] OVER (...)
인자
- expression: 값을 반환할 컬럼 또는 계산.
- offset: 현재 행 이후 몇 행 뒤에서 값을 가져올지. 지정하지 않으면 기본값은 1.
- default: 오프셋이 윈도우 범위를 벗어날 때 반환할 값. 지정하지 않으면 NULL이 반환됨.
null 처리
Pinot이 오프셋을 셀 때 null 표현식 값을 건너뛰게 하려면 LEAD 호출 뒤에 IGNORE NULLS를 사용하세요. null 값을 포함해 세려면 RESPECT NULLS를 사용하는데, 이것이 기본 동작이에요.
IGNORE NULLS가 요청한 오프셋에서 뒤쪽 null이 아닌 값을 찾지 못하면 Pinot은 선택적인 default 값을 반환하고, default가 지정되지 않았으면 NULL을 반환해요.
SELECT
sales_date,
sales_amount,
LEAD(sales_amount) IGNORE NULLS OVER (ORDER BY sales_date) AS next_non_null_sales
FROM daily_sales;
예시
현재 데이터를 기반으로 다음 날 매출을 예측해요.
다음 결제 금액을 예상해 예산을 계획해요.
비용이나 수익의 잠재적 증가를 식별해요.
현재 데이터를 기반으로 다음 날 매출을 예측하기 이 예시는 LEAD 함수로 다음 날 매출을 예상하는 방법을 보여줘요.
SELECT
sales_date,
sales_amount,
LEAD(sales_amount, 1) OVER (ORDER BY sales_date) AS next_day_sales
FROM
daily_sales;
출력:
| sales_date | sales_amount | next_day_sales |
|---|---|---|
| 2023-02-14 | 200 | 180 |
| 2023-02-15 | 180 | 220 |
| 2023-02-16 | 220 | NULL |
예산 계획을 위한 다음 결제 금액 예상 이 쿼리는 재무 예측과 예산 편성에 도움이 되도록 각 거래의 다음 결제 금액을 가져와요.
SELECT
transaction_id,
payment_date,
amount,
LEAD(amount, 1) OVER (ORDER BY payment_date) AS next_payment_amount
FROM
payments;
출력:
| transaction_id | payment_date | amount | next_payment_amount |
|---|---|---|---|
| 416 | 2023-02-14 21:21:59.996577 | 2.99 | 4.99 |
| 516 | 2023-02-14 21:23:39.996577 | 4.99 | 4.99 |
| 239 | 2023-02-14 21:29:00.996577 | 4.99 | 6.99 |
비용이나 수익의 잠재적 증가 식별 LEAD 함수로 월간 데이터를 조사해 향후 계획을 위한 비용·수익의 잠재적 증가나 추세를 예측해요.
SELECT
month,
year,
expenses,
LEAD(expenses, 1) OVER (ORDER BY year, month) AS next_month_expenses
FROM
financials;
출력:
| month | year | expenses | next_month_expenses |
|---|---|---|---|
| 1 | 2023 | 1000 | 1100 |
| 2 | 2023 | 1100 | 1200 |
| 3 | 2023 | 1200 | NULL |
CTE와 함께 사용:
WITH tmp AS (
select count(*) as num_trips,
DaysSinceEpoch
from airlineStats
GROUP BY DaysSinceEpoch
)
SELECT DaysSinceEpoch,
num_trips,
LEAD(num_trips, 2) OVER (
ORDER BY DaysSinceEpoch
) AS previous_num_trips,
num_trips - LEAD(num_trips, 2) OVER (
ORDER BY DaysSinceEpoch
) AS difference
FROM tmp;