トップ «前の日記(2017/06/11) 最新 次の日記(2017/06/15)» 編集

kaztomo日記


2017/06/14 sqlite3 でも出来そう

_ [SQL]俄SQL使いでも、ググりながらなんとかデータ作成

ポスグレはたいそうだし、sqlite3のほうが軽い(と勝手に思っている)ので、 sqlite3 でも為替データ登録のための前準備処理が出来るか試してみた。

概要として、同じ日時であっても OHLC が異なる場合を想定し、 その場合は旧テーブルの行を削除しつつ、最新テーブルをコピーしてくる。

/* make hd, hd1 table. hd means Historical Data */
DROP TABLE IF EXISTS hd;
DROP TABLE IF EXISTS hd1;
DROP TABLE IF EXISTS hdtmp;

create table hd (
id INTEGER PRIMARY KEY AUTOINCREMENT,
Date TEXT not NULL,
Time TEXT not NULL,
Open REAL not NULL,
High REAL not NULL,
Low  REAL not NULL,
Close REAL not NULL
);

create temp table hdtmp (
Date TEXT not NULL,
Time TEXT not NULL,
Open REAL not NULL,
High REAL not NULL,
Low  REAL not NULL,
Close REAL not NULL
);

create temp table hd1 as select * from hd;

/* import csv to temp table */
.import /PathToFOREXhistorical/2017.csv hdtmp

/* insert values from hdtmp to hd with automated ID */
INSERT INTO hd (Date, Time, Open, High, Low, Close)
 SELECT * FROM hdtmp;

DROP TABLE hdtmp;

/* insert temp data to hd1 */
INSERT INTO hd1 VALUES(1, '2017/06/08', '05:58:00', 6,6,6,6);
INSERT INTO hd1 VALUES(2, '2017/06/08', '05:59:00', 7,7,7,7);
INSERT INTO hd1 VALUES(3, '2017/06/08', '06:00:00', 8,8,8,8);
INSERT INTO hd1 VALUES(4, '2017/06/08', '06:01:00', 9,9,9,9);

/* count items */
SELECT "hd:";
SELECT count(*) FROM hd;
SELECT * FROM hd ORDER BY date desc, time desc LIMIT 10;

SELECT "hd1:";
SELECT count(*) FROM hd1;
SELECT * FROM hd1 ORDER BY date desc, time desc LIMIT 10;

/* count comparable data (same date, same time, but wrong OHLC) */
SELECT "differ between hd and hd1";
SELECT count(*) FROM hd, hd1
 WHERE hd.date = hd1.date
 AND hd.time = hd1.time
 AND (NOT hd.open = hd1.open);
SELECT hd.date, hd.time FROM hd, hd1
 WHERE hd.date = hd1.date
 AND hd.time = hd1.time
 AND (NOT hd.open = hd1.open);

/* delete comparable data from hd */
SELECT "Deleting comparable data";
DELETE FROM hd WHERE (date,time) IN (
 SELECT hd.date,hd.time FROM hd, hd1
 WHERE hd.date = hd1.date
 AND hd.time = hd1.time
 AND (NOT hd.open = hd1.open)
);
SELECT count(*) FROM hd;
SELECT * FROM hd ORDER BY date desc, time desc LIMIT 5;

/* inserting values from hd1 to hd */
SELECT "Inserting...hd:";
INSERT INTO hd (Date,Time,Open,High,Low,Close)
 SELECT Date,time,Open,High,Low,Close FROM hd1;

SELECT count(*) FROM hd;
SELECT * FROM hd ORDER BY date desc, time desc LIMIT 5;

参考にさせて頂いたサイト: