history 로직
2022-06-04
햇 ^__^
지금부터는 azure 랑 관련이 있는건 아니고,
azure 에 구축한 클라이언트 앱
또는 api 서버
를 수정을 어떻게 해 나가는지에 대한 기록이 될 것 같습니다.
따로 포트폴리오라는 category를 만들어야 될 것 같은데, 일단 azure 카테고리에서 포스팅을 하도록 하겠습니다.
매일 1분 단위로 데이러를 쌓고 있는데, 쌓은 데이터의 스키마 및 데이터는 아래와 같습니다.
select * from investing;
createTime | current | high | low | changePrice | changeRate | tradingVolume | tradeTime | score | stock |
---|---|---|---|---|---|---|---|---|---|
2022-05-04 14:35:00 | 3350 | 3640 | 3310 | -270 | 92.54 | 1190000 | 15:59:00 | 215 | 골드앤에스 |
2022-05-04 14:35:00 | 207500 | 208500 | 204000 | 3500 | 101.72 | 75490 | 15:44:04 | 981 | 삼성화재 |
2022-05-04 14:35:00 | 2565 | 2570 | 2550 | -10 | 99.61 | 8310 | 15:30:27 | 215 | 유화증권 |
2022-05-04 14:35:00 | 8850 | 8920 | 8400 | -30 | 99.66 | 424210 | 15:40:56 | 1075 | 디아이 |
2022-05-04 14:35:00 | 1470 | 1485 | 1455 | 0 | 100.0 | 724100 | 15:49:00 | 579 | 대신정보통신 |
여기서 제가 원하는 것은 score가 가장 높은 stock들 각각 몇분동안 유지를 했었고, 처음 금액과 끝날때의 금액을 알고자 합니다.
한마디로 시뮬레이션을 돈 것 같은 쿼리를 짜보고 싶은데, 쿼리로는 어떻게 짜야 될지 감이 오지 않습니다.
불가능 할것 같진 않는데, 그냥 시뮬레이션 테이블이라는걸 만들어 진행하도록 하겠습니다.
시나리오
제가 생각하는 시나리오는 아래와 같습니다.
- score 가 1075 이면, 인서트를 한다.
- 단 state 가
ing
인, stock 이 있으면 업데이트를 한다. - 업데이트는 current 와 currentTime을 업데이트 한다.
- 인서트는 initCurrent, initTime, state:
ing
, stock 를 한다. -
하나의 스탭이 종료되는 시점에 state :
ing
이면서, currentTime 이 현재시간이 아닌 stock 은 state:end
로 변환한다. - 다음 스탭을 진행한다. 단 현재 시간이 되면 멈춘다.
이 시나리오를 구현해 보도록 하겠습니다.
구현
1 테이블 생성
먼저 simulation 이라는 테이블을 생성합니다.
create table SIMULATION (
stock varchar(100),
state varchar(3),
initCurrent int(11),
initTime timestamp,
current int(11),
currentTime timestamp
);
2 start api 를 만들기
url은 아래와 같이 만들도록 하겠습니다.
SimulationApi.start()
/simulation/start
3 investing 테이블에서 현제 데이터 가져오기
현제 데이터의 조건은 아래와 같다고 생각하겠습니다.
where
score = 1075
and
createTime = DATE_FORMAT({현재시간},'%Y-%m-%d %H:%i:00')
현재 시간은 처음 테스트 시에는 아래가 기준입니다.
select min(createTime)
from INVESTING
그 뒤 테스트 동안은 아래의 시간을 기준으로 사용 할 것입니다.
select max(createTime)
from SIMULATION
실제 운영시에는 당연히 현재시간이 기준이 됩니다.
now()
4 업데이트용 인서트용 나눠서 가져오기
가져올때, join 구문을 이용하여
SIMULATION 에서 state 가 ing
인 stcok 과 일치하는 데이터는 update 용
InvestingDao.getDataForUpdate()
stock in (select STOCK
from SIMULATION
where STATE = 'ing')
일치하지 않는 데이터 는 insert 용 으로 가져온다.
SIMULATIONDao.getDataForInsert()
stock not in (select STOCK
from SIMULATION
where STATE = 'ing')
5 인서트 진행
인서트용 데이터는 인서트
SimulationDao.getInsert()
insert into SIMULATION (
stock,
state,
initCurrent,
initTime
) values (
#{stock},
"ing",
)
stock varchar(100),
state = '',
initCurrent int(11),
initTime timestamp,
current int(11),
currentTime timestamp
);
6 업데이트 진행
업데이트 데이터는 업데이트
SimulationDao.getDataForInsert()
currentTime