作为Python和SQLite的初学者,如果我有更优雅的解决方案,我就会徘徊。
我当前的SQLite数据库包含几个时间序列:
CREATE TABLE Y1 (time REAL, value REAL);
CREATE TABLE Y2 (time REAL, value REAL);
CREATE TABLE Y3 (time REAL, value REAL);
...
所有变量的时间值都不相同,但可能存在dublicates。
但是,由于变量列表正在增加,我想将数据传输到像这样的结构。 表'VARLIST'应该收集所有变量。
CREATE TABLE VARLIST (VarID INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL);
INSERT INTO VARLIST VALUES(1, 'Y1');
INSERT INTO VARLIST VALUES(2, 'Y2');
...
数据点本身应转移到表TIMESTAMPS
和DATAPOINTS
。时间戳在sperate tabele中,因为我想将其他信息与此邮票相关联(此siplified示例中未显示)。
CREATE TABLE TIMESTAMPS (timeID INTEGER PRIMARY KEY, time REAL);
CREATE TABLE DATAPOINTS (DataID INTEGER PRIMARY KEY, timeID INTEGER, VarID INTEGER, value REAL);
我的问题是:如何从表Y1
和Y6
中的表TIMESTAMPS
.. DATAPOINTS
中最好地传输数据?当然,我可以将所有数据读出到Python,让Python进行重组。无论如何,我想知道这是否也可以通过仅使用SQLite命令来实现。
答案 0 :(得分:1)
可以简单地复制时间戳:
INSERT INTO TimeStamps(time)
SELECT time FROM Y1 UNION
SELECT time FROM Y2 UNION
SELECT time FROM Y3 UNION
SELECT time FROM Y4 UNION
SELECT time FROM Y5 UNION
SELECT time FROM Y6;
数据点需要查找(使用correlated subquery)相应的时间戳ID:
INSERT INTO DataPoints(timeID, VarID, value)
SELECT (SELECT timeID
FROM TimeStamps
WHERE time = all_Y.time),
VarID,
value
FROM (SELECT time, 1 AS VarID, value FROM Y1 UNION ALL
SELECT time, 2, value FROM Y2 UNION ALL
SELECT time, 3, value FROM Y3 UNION ALL
SELECT time, 4, value FROM Y4 UNION ALL
SELECT time, 5, value FROM Y5 UNION ALL
SELECT time, 6, value FROM Y6) AS all_Y;