LAG() 함수를 이용하여 증감 표현하기
간단한 증감 표현을 예시로 들 거라서 데이터 삽입은 하지 않고, inline view를 사용하였다.
우선 데이터를 살펴보면 다음과 같다.

1일부터 5일까지 총 5일간의 주문수(ord_cnt)를 표현하였다.
이전 날짜와 비교하여 증감을 나타내고, 주문수 순위와 누적 주문수를 출력한다.
조건
이전 날짜와 현재 날짜의 주문수가 동일한 값(또는 이전 날짜의 데이터가 없음) 일 때 증감 부분은 - 로 나타낸다.
이전 날짜보다 현재 날짜의 주문수가 적은 경우 ▼로 표현하고, 이전 날짜보다 현재 날짜의 주문수가 많은 경우에는 ▲로 표현한다.
주문수 순위 부분에서 주문수가 동일한 경우 동일 순위로 표시하고, 다음 순위는 중복 순위와 상관없이 그대로 이어진다.
코드
WITH ord_view AS
(SELECT '2022-02-01' dt, 1000 ord_cnt FROM dual
UNION ALL
SELECT '2022-02-02' dt, 966 ord_cnt FROM dual
UNION ALL
SELECT '2022-02-03' dt, 600 ord_cnt FROM dual
UNION ALL
SELECT '2022-02-04' dt, 600 ord_cnt FROM dual
UNION ALL
SELECT '2022-02-05' dt, 1005 ord_cnt FROM dual)
SELECT dt,
ord_cnt,
CASE
WHEN LAG(ord_cnt) OVER(ORDER BY dt) > ord_cnt THEN '▼'
WHEN LAG(ord_cnt) OVER(ORDER BY dt) < ord_cnt THEN '▲'
ELSE '-'
END AS "증감",
dense_rank() OVER(ORDER BY ord_cnt DESC) "순위",
SUM(ord_cnt) OVER(ORDER BY dt) "누적주문수"
FROM ord_view
ORDER BY dt;
With Query를 사용하여 필요한 데이터 값을 view로 사용한다.
증감은 CASE WHEN THEN 표현식을 사용하여 구현했다. 전일 주문수와 금일 주문수를 비교한다.
전일 주문수가 금일 주문수의 초과인 경우 ▼가 출력되게 하고, 이와 반대인 경우 ▲가 출력되게 한다.
두 경우 모두 해당되지 않는다면 전일 주문수와 금일 주문수가 동일하다(또는 전일 주문수가 존재하지 않음)는 의미이니 -가 출력되게 하였다.
dense_rank() 함수를 사용하여 주문수 순위를 출력하였다. 주문수가 높은 순대로 순위를 매기기 위하여 내림차순(DESC) 정렬하였다. 주문수가 동일한 경우 같은 순위로 출력된다.
SUM(주문수) OVER(ORDER BY 날짜)를 사용하여 누적 주문수를 출력한다.
OVER() 함수를 사용함으로써 GROUP BY를 사용하지 않아도 된다.
결과

LAG() 함수를 이용하여 증감 표현하기
간단한 증감 표현을 예시로 들 거라서 데이터 삽입은 하지 않고, inline view를 사용하였다.
우선 데이터를 살펴보면 다음과 같다.

1일부터 5일까지 총 5일간의 주문수(ord_cnt)를 표현하였다.
이전 날짜와 비교하여 증감을 나타내고, 주문수 순위와 누적 주문수를 출력한다.
조건
이전 날짜와 현재 날짜의 주문수가 동일한 값(또는 이전 날짜의 데이터가 없음) 일 때 증감 부분은 - 로 나타낸다.
이전 날짜보다 현재 날짜의 주문수가 적은 경우 ▼로 표현하고, 이전 날짜보다 현재 날짜의 주문수가 많은 경우에는 ▲로 표현한다.
주문수 순위 부분에서 주문수가 동일한 경우 동일 순위로 표시하고, 다음 순위는 중복 순위와 상관없이 그대로 이어진다.
코드
WITH ord_view AS
(SELECT '2022-02-01' dt, 1000 ord_cnt FROM dual
UNION ALL
SELECT '2022-02-02' dt, 966 ord_cnt FROM dual
UNION ALL
SELECT '2022-02-03' dt, 600 ord_cnt FROM dual
UNION ALL
SELECT '2022-02-04' dt, 600 ord_cnt FROM dual
UNION ALL
SELECT '2022-02-05' dt, 1005 ord_cnt FROM dual)
SELECT dt,
ord_cnt,
CASE
WHEN LAG(ord_cnt) OVER(ORDER BY dt) > ord_cnt THEN '▼'
WHEN LAG(ord_cnt) OVER(ORDER BY dt) < ord_cnt THEN '▲'
ELSE '-'
END AS "증감",
dense_rank() OVER(ORDER BY ord_cnt DESC) "순위",
SUM(ord_cnt) OVER(ORDER BY dt) "누적주문수"
FROM ord_view
ORDER BY dt;
With Query를 사용하여 필요한 데이터 값을 view로 사용한다.
증감은 CASE WHEN THEN 표현식을 사용하여 구현했다. 전일 주문수와 금일 주문수를 비교한다.
전일 주문수가 금일 주문수의 초과인 경우 ▼가 출력되게 하고, 이와 반대인 경우 ▲가 출력되게 한다.
두 경우 모두 해당되지 않는다면 전일 주문수와 금일 주문수가 동일하다(또는 전일 주문수가 존재하지 않음)는 의미이니 -가 출력되게 하였다.
dense_rank() 함수를 사용하여 주문수 순위를 출력하였다. 주문수가 높은 순대로 순위를 매기기 위하여 내림차순(DESC) 정렬하였다. 주문수가 동일한 경우 같은 순위로 출력된다.
SUM(주문수) OVER(ORDER BY 날짜)를 사용하여 누적 주문수를 출력한다.
OVER() 함수를 사용함으로써 GROUP BY를 사용하지 않아도 된다.
결과
