어떤 동일한 결과를 도출하기 위하여, 사람들마다 각자의 성향으로 쿼리가 나올 것이다.

그 중 대비 및 등락률을 구함에 있어 내가 자주 사용하는 쿼리는 다음과 같다.

예전 오라클에서 아래의 느낌으로 사용하다가 이후 알티베이스에서도 동일하게 사용했었으며, 최근 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, 종목
;
Posted by 겨울섬
,