- 카테고리:
윈도우 함수 (순위 관련)
LAG¶
테이블 자체를 조인하지 않으면서 동일 결과 세트의 이전 행에 있는 데이터에 액세스합니다.
- 참고 항목:
구문¶
LAG ( <expr> [ , <offset> , <default> ] ) [ { IGNORE | RESPECT } NULLS ]
OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] )
인자¶
expr
지정된 오프셋을 기준으로 반환할 식입니다.
offset
값을 가져오는 현재 행의 뒤쪽 행 수입니다. 예를 들어
offset
이 2는 행 간격이 2인expr
값을 반환합니다.음수 오프셋을 설정하는 것은 LEAD 함수를 사용하는 것과 같은 효과를 가집니다.
기본값은 1입니다.
default
오프셋이 윈도우 범위를 벗어날 때 반환할 식입니다. 유형이
expr
과 호환되는 모든 식을 지원합니다.기본값은 NULL입니다.
사용법 노트¶
IGNORE NULLS 절이 설정된 경우, 식이 NULL로 평가되는 행은 오프셋 행 계산 시 포함되지 않습니다.
{ IGNORE | RESPECT } NULLS
가 지정되지 않은 경우, 기본값은RESPECT NULLS
입니다.PARTITION BY
절은 FROM 절에 의해 생성된 결과 세트를 함수가 적용되는 파티션으로 분할합니다. 이것과ORDER BY
절에 대한 자세한 내용은 윈도우 함수 를 참조하십시오.ORDER BY
절은 각 파티션 내의 데이터를 정렬합니다.
예¶
테이블을 만들고 데이터를 로딩합니다.
CREATE OR REPLACE TABLE sales(emp_id INTEGER, year INTEGER, revenue DECIMAL(10,2));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);
이 쿼리는 올해 수익과 전년도 수익 간의 차이를 보여줍니다.
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; +--------+------+----------+--------------+ | 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);INSERT INTO t1 VALUES (1, 5), (2, 4), (3, NULL), (4, 2), (5, NULL), (6, NULL), (7, 6);
이 쿼리는 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; +-------+-------+-----------------------------------------------+ | 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 | +-------+-------+-----------------------------------------------+