반응형
오늘은 주식 데이터(stock 테이블)를 이용하여 52주 기준의 최소/최대 종가, 가격 차이, 등락률을 구하는 방법을 배웠습니다. 실무에서 주가 분석 지표로 자주 활용되는 로직입니다.
📌 52주 가격 통계 구하기
📘 기본 쿼리 구조
SELECT
symbol,
CONVERT(decimal(18,2), MIN([close])) AS w52_min,
CONVERT(decimal(18,2), MAX([close])) AS w52_max,
CONVERT(decimal(18,2), MAX([close]) - MIN([close])) AS w52_diff_price,
CONVERT(decimal(18,2), (MAX([close]) - MIN([close])) / MIN([close]) * 100) AS w52_diff_ratio
FROM stock
WHERE date BETWEEN DATEADD(WEEK, -52, '2021-10-04') AND '2021-10-04'
GROUP BY symbol
💡 해당 쿼리는 각 종목(symbol)에 대해 최근 52주(2021-10-04 기준) 동안의:
- 최저 종가 w52_min
- 최고 종가 w52_max
- 가격 차이 w52_diff_price
- 등락률 w52_diff_ratio (최저가 대비 등락 퍼센트)
📌 서브쿼리 방식으로 리팩터링한 버전
SELECT
X.symbol,
w52_min,
w52_max,
w52_max - w52_min AS w52_diff_price,
(w52_max - w52_min) / w52_min * 100 AS w52_diff_ratio
FROM (
SELECT
symbol,
CONVERT(decimal(18,2), MIN([close])) AS w52_min,
CONVERT(decimal(18,2), MAX([close])) AS w52_max
FROM stock
WHERE date BETWEEN DATEADD(WEEK, -52, '2021-10-04') AND '2021-10-04'
GROUP BY symbol
) AS X
💡 이 방식은 계산식을 SELECT 절 바깥에서 처리하여 가독성과 재활용성을 높입니다.
📌 0으로 나눔 방지 로직 포함한 안전한 버전
SELECT
X.symbol,
w52_min,
w52_max,
w52_max - w52_min AS w52_diff_price,
CONVERT(decimal(18,2),
CASE
WHEN w52_min > 0 THEN (w52_max - w52_min) / w52_min * 100
ELSE 0
END
) AS w52_diff_ratio
FROM (
SELECT
symbol,
CONVERT(decimal(18,2), MIN([close])) AS w52_min,
CONVERT(decimal(18,2), MAX([close])) AS w52_max
FROM stock
WHERE date BETWEEN DATEADD(WEEK, -52, '2021-10-04') AND '2021-10-04'
GROUP BY symbol
) AS X
💡 CASE WHEN w52_min > 0 조건을 통해 0으로 나누는 오류를 방지합니다.
💡 포인트 정리
- DATEADD(WEEK, -52, 기준일자)를 이용하면 최근 1년(52주)의 데이터를 필터링할 수 있다.
- MIN(), MAX() 함수로 최소/최대 종가를 추출하고, 이를 이용해 가격 변화량과 등락률을 계산할 수 있다.
- 계산 시 0 나눗셈 오류 방지를 위해 CASE WHEN 구문을 활용하는 것이 안전하다.
- 복잡한 연산은 서브쿼리로 분리하면 유지 보수성과 가독성이 향상된다.
📌정리하자면, 오늘은 최근 52주간의 주가 분석을 주제로, 주식 종목별 최소/최대 가격과 가격 변화율을 SQL로 계산하는 방법을 배웠습니다. 실전에서 활용도가 높은 주제인 만큼, 다양한 변형 쿼리를 통해 익숙해지는 것이 중요합니다.
'국비' 카테고리의 다른 글
[ 40일차 1 ] 수업 정리 - Spring (0) | 2025.06.12 |
---|---|
[ 39일차 시험 ] 수업 정리 - SQL (2) | 2025.06.11 |
[ 38일차 자습 ] 수업 정리 - SQL (0) | 2025.06.10 |
[ 36일차 43~52 ] 수업 정리 - SQL (0) | 2025.06.05 |
[ 35일차 28~42 ] 수업 정리 - SQL (0) | 2025.06.04 |
[ 34일차 14~27 ] 수업 정리 - SQL (4) | 2025.06.02 |