SQL 지연

Sql Jiyeon



SQL lag() 함수를 사용하면 특정 오프셋에서 현재 행의 이전 행에 액세스할 수 있습니다. 즉, lag() 함수를 사용하면 현재 행에서 이전 행에 액세스할 수 있습니다. 오프셋 값을 지정하면 현재 행에서 이전 1, 2, 3 등의 행에 액세스할 수 있습니다.

이는 후속 행에 액세스할 수 있게 해주는 Lead() 함수와 반대입니다.







SQL 지연()

함수 구문은 다음과 같습니다.



LAG(값_표현식, 오프셋 [, 기본값])
위에 (
[PARTITION BY 파티션_표현식]
ORDER BY 정렬 표현식 [ASC | 설명]
);

지원되는 인수는 다음과 같습니다.



  • 값_표현 – 이전 행의 반환 값을 지정합니다. 표현식은 단일 값으로 평가되어야 합니다.
  • 오프셋 – 현재 행부터 뒤로 몇 행까지 접근할지 지정한다.
  • 기본 – 오프셋이 파티션 범위를 벗어나는 경우 기본값을 설정합니다. 기본적으로 값은 NULL로 설정됩니다.
  • 파티션 기준 – 데이터를 분할하는 방법을 지정합니다.
  • 주문 – 각 파티션의 행에 대한 순서 형식을 설정합니다.

샘플 데이터 설정

lag() 함수의 작동 방식을 살펴보기 전에 데모용 기본 테이블을 설정하는 것부터 시작하겠습니다.





CREATE TABLE 제품(
product_id INT PRIMARY KEY AUTO_INCREMENT,
제품_이름 VARCHAR(255),
카테고리 VARCHAR(255),
가격 DECIMAL(10, 2),
수량 INT,
만료_날짜 DATE,
바코드 BIGINT
);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
값('셰프모자 25cm',
'빵집',
24.67,
57,
'2023-09-09',
2854509564204);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
값('메추리알 - 통조림',
'식료품 저장실',
17.99,
67,
'2023-09-29',
1708039594250);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
값('커피 - 에그노그 카푸치노',
'빵집',
92.53,
10,
'2023-09-22',
8704051853058);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
값('배 - 가시투성이',
'빵집',
65.29,
48,
'2023-08-23',
5174927442238);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
값('파스타 - 엔젤헤어',
'식료품 저장실',
48.38,
59,
'2023-08-05',
8008123704782);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
value ​​('와인 - 프로세코 발도비아덴',
'생산하다',
44.18,
삼,
'2023-03-13',
6470981735653);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
value('페스트리 - 프렌치 미니 모듬',
'식료품 저장실',
36.73,
52,
'2023-05-29',
5963886298051);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
값('오렌지 - 통조림, 만다린',
'생산하다',
65.0,
1,
'2023-04-20',
6131761721332);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
값('돼지고기 - 어깨',
'생산하다',
55.55,
73,
'2023-05-01',
9343592107125);

끼워 넣다
~ 안으로
제품(제품_이름,
범주,
가격,
수량,
만료 날짜,
바코드)
values ​​('Dc Hikiage Hira Huba',
'생산하다',
56.29,
53,
'2023-04-14',
3354910667072);

데이터 생성 및 설정이 완료되면 몇 가지 예를 살펴보겠습니다.

예 1: 기본 사용법

이 경우 제품 정보가 포함된 '제품' 테이블에 액세스할 수 있습니다. 현재 행에서 이전 바코드를 가져오고 싶다고 가정해 보겠습니다.

다음과 같이 lag() 함수를 사용할 수 있습니다.

선택하다
상품명,
가격,
지연(바코드) 초과(범주별 파티션
주문
가격 오름차순) 이전_항목
~에서
제품 p;

주어진 코드는 카테고리에 따라 데이터를 분할합니다. 그런 다음 lag() 함수를 사용하여 파티션의 이전 바코드를 가져옵니다.

결과 출력은 다음과 같습니다.

예 2: 기본값 설정

특정 열(범위 밖)에 이전 행이 없는 경우 함수는 이전 예제와 같이 값을 NULL로 설정합니다.

범위 밖의 액세스에 대한 기본값을 설정하려면 다음을 수행할 수 있습니다.

선택하다
상품명,
가격,
lag(barcode, 1, 'N/A') over (범주별 파티션
주문
가격 오름차순) 이전_항목
~에서
제품 p;

기본값을 “N/A”로 설정했습니다. 이는 출력에 표시된 대로 범위를 벗어난 값을 대체해야 합니다.

예 3: 사용자 정의 오프셋 값

현재 행에서 이전 두 행에 액세스한다고 가정해 보겠습니다. 오프셋 값을 2로 설정하면 됩니다.

쿼리 예시는 다음과 같습니다.

선택하다
상품명,
가격,
lag(barcode, 2, 'N/A') over (범주별 파티션
주문
가격 오름차순) 이전_항목
~에서
제품 p;

산출:

이 쿼리는 각 파티션의 이전 두 행을 반환합니다.

결론

이 튜토리얼에서는 lag() 함수를 사용하여 현재 행에서 이전 항목을 가져오는 방법을 배웠습니다.