어떤 동일한 결과를 도출하기 위하여, 사람들마다 각자의 성향으로 쿼리가 나올 것이다.
그 중 대비 및 등락률을 구함에 있어 내가 자주 사용하는 쿼리는 다음과 같다.
예전 오라클에서 아래의 느낌으로 사용하다가 이후 알티베이스에서도 동일하게 사용했었으며, 최근 MySQL에서도 8버전 이후부터 집계함수를 지원한다고 하여 작성해보았는데 동일한 결과가 도출됨을 확인하였다.
각 DBMS마다 제공되는 내장함수들의 이름이나 문법만 살짝 다르고, 기본 틀은 그대로 사용하면 된다.
(필요시 대비와 등락률에 대해 반올림 또는 버림 처리)
■ DBMS별 내장함수 비교 일부
오라클, 알티베이스 | MySQL |
DECODE | IF |
NVL | IFNULL |
TRUNC | TRUNCATE |
SELECT 일자
, 종목
, 종가
, 종가-IFNULL(전일종가,0) AS 대비
, IF(IFNULL(전일종가,0)=0,0,((종가-IFNULL(전일종가,0))/ABS(IFNULL(전일종가,0))))*100. AS 등락률
FROM (
SELECT 일자
, 종목
, 종가
, LEAD(종가) OVER(PARTITION BY 종목 ORDER BY 일자 DESC) AS 전일종가
, RANK() OVER(PARTITION BY 종목 ORDER BY 일자 DESC) AS rank_no
FROM 테이블
)
WHERE rank_no = rank_no -- 종목별 전체기간 대상으로 결과를 보여주며, 만약 종목별 가장최근 결과만 보고싶으면 rank_no=1
ORDER BY 일자 DESC, 종목
;