date_dim 데이터를 살펴보자.
SELECT * FROM date_dim
date_dim 테이블의 날짜 컬럼인 date 범위는 다음과 같다.
SELECT MIN(date), MAX(date)
FROM date_dim
retail_sales 테이블에서 Women store와 1월 7월에 해당하는 날짜와 매출을 조회한다.
SELECT sales_month, sales
FROM retail_sales
WHERE kind_of_business = 'Women''s clothing stores'
AND DATE_PART('month', sales_month) IN (1, 7)
SELECT A.date, B.sales_month, B.sales
FROM date_dim AS A
JOIN (SELECT sales_month, sales
FROM retail_sales
WHERE kind_of_business = 'Women''s clothing stores'
AND DATE_PART('month', sales_month) IN (1, 7)
) AS B ON B.sales_month BETWEEN A.date - INTERVAL '11 month' AND A.date
WHERE A.date = A.first_day_of_month
AND A.date BETWEEN '1993-01-01' AND '2020-12-01'
ORDER BY A.date ASC, B.sales_month ASC;
SELECT
A.date,
ROUND(AVG(B.sales), 2) AS moving_avg,
COUNT(B.sales) AS records
FROM date_dim AS A
JOIN (SELECT sales_month, sales
FROM retail_sales
WHERE kind_of_business = 'Women''s clothing stores'
AND DATE_PART('month', sales_month) IN (1, 7)
) AS B ON B.sales_month BETWEEN A.date - INTERVAL '11 month' AND A.date
WHERE A.date = A.first_day_of_month
AND A.date BETWEEN '1993-01-01' AND '2020-12-01'
GROUP BY A.date
ORDER BY A.date ASC;
1993-01-01부터 2020-12-01까지의 고유한 날짜 테이블을 조회한다.
SELECT DISTINCT(sales_month)
FROM retail_sales
WHERE sales_month BETWEEN '1993-01-01' AND '2020-12-01'
ORDER BY sales_month;
SELECT A.sales_month, ROUND(AVG(B.sales), 2) AS moving_avg
FROM(
SELECT DISTINCT(sales_month)
FROM retail_sales
WHERE sales_month BETWEEN '1993-01-01' AND '2020-12-01'
) AS A JOIN retail_sales AS B
ON B.sales_month BETWEEN A.sales_month - INTERVAL '11 month' AND A.sales_month
AND B.kind_of_business = 'Women''s clothing stores'
GROUP BY A.sales_month
ORDER BY A.sales_month ASC;