카테고리:

윈도우 함수 구문 및 사용법 (순위 지정)

LAG

테이블 자체를 조인하지 않으면서 동일 결과 세트의 이전 행에 있는 데이터에 액세스합니다.

참고 항목:

LEAD

구문

LAG ( <expr> [ , <offset> , <default> ] ) [ { IGNORE | RESPECT } NULLS ]
    OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] )
Copy

인자

expr

지정된 오프셋을 기준으로 반환할 식입니다.

offset

값을 가져오는 현재 행의 뒤쪽 행 수입니다. 예를 들어 offset 이 2는 행 간격이 2인 expr 값을 반환합니다.

음수 오프셋을 설정하는 것은 LEAD 함수를 사용하는 것과 같은 효과를 가집니다.

기본값은 1입니다.

default

오프셋이 윈도우 범위를 벗어날 때 반환할 식입니다. 유형이 expr 과 호환되는 모든 식을 지원합니다.

기본값은 NULL입니다.

{ IGNORE | RESPECT } NULLS

expr 에 NULL 값이 포함된 경우 NULL 값을 무시할지 또는 적용할지 여부입니다.

  • IGNORE NULLS 는 오프셋 행을 계산할 때 식이 NULL 로 평가되는 모든 행을 제외합니다.

  • RESPECT NULLS 는 오프셋 행을 계산할 때 식이 NULL 로 평가되는 모든 행을 포함합니다.

기본값: RESPECT NULLS

사용법 노트

  • PARTITION BY 절은 FROM 절에 의해 생성된 결과 세트를 함수가 적용되는 파티션으로 분할합니다. 자세한 내용은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.

  • ORDER BY 절은 각 파티션 내의 데이터를 정렬합니다.

테이블을 만들고 데이터를 로딩합니다.

CREATE OR REPLACE TABLE sales(
  emp_id INTEGER,
  year INTEGER,
  revenue DECIMAL(10,2));
Copy
INSERT INTO sales VALUES
  (0, 2010, 1000),
  (0, 2011, 1500),
  (0, 2012, 500),
  (0, 2013, 750);
INSERT INTO sales VALUES
  (1, 2010, 10000),
  (1, 2011, 12500),
  (1, 2012, 15000),
  (1, 2013, 20000);
INSERT INTO sales VALUES
  (2, 2012, 500),
  (2, 2013, 800);
Copy

이 쿼리는 올해 수익과 전년도 수익 간의 차이를 보여줍니다.

SELECT emp_id, year, revenue,
       revenue - LAG(revenue, 1, 0) OVER (PARTITION BY emp_id ORDER BY year) AS diff_to_prev
  FROM sales
  ORDER BY emp_id, year;
Copy
+--------+------+----------+--------------+
| EMP_ID | YEAR |  REVENUE | DIFF_TO_PREV |
|--------+------+----------+--------------|
|      0 | 2010 |  1000.00 |      1000.00 |
|      0 | 2011 |  1500.00 |       500.00 |
|      0 | 2012 |   500.00 |     -1000.00 |
|      0 | 2013 |   750.00 |       250.00 |
|      1 | 2010 | 10000.00 |     10000.00 |
|      1 | 2011 | 12500.00 |      2500.00 |
|      1 | 2012 | 15000.00 |      2500.00 |
|      1 | 2013 | 20000.00 |      5000.00 |
|      2 | 2012 |   500.00 |       500.00 |
|      2 | 2013 |   800.00 |       300.00 |
+--------+------+----------+--------------+

다른 테이블을 만들고 데이터를 로딩합니다.

CREATE OR REPLACE TABLE t1 (
  col_1 NUMBER,
  col_2 NUMBER);
Copy
INSERT INTO t1 VALUES
  (1, 5),
  (2, 4),
  (3, NULL),
  (4, 2),
  (5, NULL),
  (6, NULL),
  (7, 6);
Copy

이 쿼리는 IGNORE NULLS 절이 출력에 미치는 영향을 보여줍니다. 모든 행(첫 번째 행 제외)은 선행 행에 NULL이 포함된 경우에도 NULL 이외의 값을 포함합니다. 선행 행에 NULL이 포함된 경우, 현재 행은 NULL 이외의 가장 최근 값을 사용합니다.

SELECT col_1,
       col_2,
       LAG(col_2) IGNORE NULLS OVER (ORDER BY col_1)
  FROM t1
  ORDER BY col_1;
Copy
+-------+-------+-----------------------------------------------+
| COL_1 | COL_2 | LAG(COL_2) IGNORE NULLS OVER (ORDER BY COL_1) |
|-------+-------+-----------------------------------------------|
|     1 |     5 |                                          NULL |
|     2 |     4 |                                             5 |
|     3 |  NULL |                                             4 |
|     4 |     2 |                                             4 |
|     5 |  NULL |                                             2 |
|     6 |  NULL |                                             2 |
|     7 |     6 |                                             2 |
+-------+-------+-----------------------------------------------+