SQL 문법 정리 : (FIRST_VALUE,LAST_VALUE,LAG,LEAD)
SQL 문법 정리 : (FIRST_VALUE,LAST_VALUE,LAG,LEAD)
FIRST_VALUE
특정 집합 내에서 결과 건수의 변화 없이 해당 집합안에서 특정 컬럼의 첫번재 값을 구하는 함수이다.
SELECT
A.PRODUCT_NAME, B.GROUP_NAME, A.PRICE
,FIRST_VALUE (A.PRICE) OVER
(PARTITION BY B.GROUP_NAME ORDER BY A.PRICE)
AS LOWER_PRICE_PER_GROUP
FROM PRODUCT A
INNER JOIN PRODUCT_GROUP B
ON (A.GROUP_ID = B.GROUP_ID);
(#가장 첫번째 나오는 PRICE값을 출력한다.GROUP_NAME 컬럼 기준으로 PRICE컬럼으로 정렬한 값중에서)
(#GROUP_NAME 기준 PRICE가 가장 작은 값이 출력되었다.)
LAST_VALUE
특정 집합 내에서 결과 건수의 변화 없이 해당 집합안에서 특정 컬럼의 혹은 마지막 값을 구하는 함수이다.
SELECT
A.PRODUCT_NAME, B.GROUP_NAME, A.PRICE
, LAST_VALUE (A.PRICE) OVER
(PARTITION BY B.GROUP_NAME ORDER BY A.PRICE
RANGE BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING)
AS LOWER_PRICE_PER_GROUP
FROM PRODUCT A
INNER JOIN PRODUCT_GROUP B
ON (A.GROUP_ID = B.GROUP_ID);
(#가장 마지막에 나오는 PRICE값을 출력한다.GROUP_NAME 컬럼 기준으로 PRICE컬럼으로 정렬한 값중에서)
(#파티션의 첫번째로우부터 파티션이 마지막 로우까지)
(#GROUP_NAME기준 PRICE가 가장 큰 값이 출력되었다)
LAG()
특정 집합 내에서 결과 건수의 변화 없이 해당 집합안에서 특정 컬럼의 이전행의 값을 찾는다.
SELECT A.PRODUCT_NAME, B.GROUP_NAME, A.PRICE
,LAG(A.PRICE,1) OVER (PARTITION BY B.GROUP_NAME ORDER BY A.PRICE)
AS PREV_PRICE
,A.PRICE - LAG(PRICE, 1) OVER ( PARTITION BY GROUP_NAME ORDER BY A.PRICE)
AS CUR_PREV_DIFF
FROM PRODUCT A
INNER JOIN PRODUCT_GROUP B
ON (A.GROUP_ID = B.GROUP_ID);
(#PRICE의 이전 행의 값을 구한다. GROUP_NAME컬럼 기준으로 PRICE컬럼으로 정렬한 값 중에서)
(#현재형의 PRICE에서 이전행의 PRICE를 뺀다.GROUP_NAME컬럼 기준으로 PRICE컬럼으로 정렬한 값 중에서)
LEAD
특정 집합 내에서 결과 건수의 변화 없이 해당 집합안에서 특정 컬럼의 다음 행의 값을 찾는다.
SELECT A.PRODUCT_NAME, B.GROUP_NAME, A.PRICE
,LEAD(A.PRICE,1) OVER (PARTITION BY B.GROUP_NAME ORDER BY A.PRICE)
AS PREV_PRICE
,A.PRICE - LEAD(PRICE, 1) OVER ( PARTITION BY GROUP_NAME ORDER BY A.PRICE)
AS CUR_PREV_DIFF
FROM PRODUCT A
INNER JOIN PRODUCT_GROUP B
ON (A.GROUP_ID = B.GROUP_ID);
(#PRICE의 다음 행의 값을 구한다. GROUP_NAME컬럼 기준으로 PRICE컬럼으로 정렬한 값 중에서)
(#현재형의 PRICE에서 이전행의 PRICE를 뺀다.GROUP_NAME컬럼 기준으로 PRICE컬럼으로 정렬한 값 중에서)