我有一个数据库,其中包含历史河流水位和降雨数据。有一个“水位”表,其属性包括进行测量的日期以及该日期的河流水位。还有一个“降雨”表,同样,该表具有日期和该日期的降雨量等属性。
我想对这些数据(在 R 中)进行一些回归,所以我试图将我的数据转换为以下格式:
Date | Level | Level yesterday | Level 2 days ago | ... | Level 5 days ago | Rainfall | Rainfall yesterday | Rainfall 2 days ago | ... | Rainfall 5 days ago
这种格式意味着预测当前级别所需的所有数据都包含在一行中。
我有一些(非常丑陋的)代码可以做到这一点,但它太慢了。
以下代码尝试从 2000 年以来的仅几年中仅从 1 个仪表中选择前一天的级别。(有关级别和降雨的更多历史,我只需包含更多子查询。)
SELECT level, rainfall,
(
SELECT K.level
FROM Levels as K
WHERE L.gauge_id = K.gauge_id
AND
julianday(L.year || '-' || substr('00'||L.month,-2) || '-' ||substr('00'||L.day,-2)) -
julianday(K.year || '-' || substr('00'||K.month,-2) || '-' ||substr('00'||K.day,-2))
= -1
LIMIT 1
) as L1
FROM Levels as L JOIN Gauges as G ON (L.gauge_id = G.id)
JOIN Rainfall as R ON (R.station_id = G.nearestStat)
WHERE L.year=R.year AND L.month=R.month AND L.day=R.day
AND L.gauge_id = 208006
AND L.year>2000
这个大大简化和减少的查询在 R 中执行大约需要 30 分钟(使用 ans=dbGetQuery(db, query))。这只返回约 6000 行,而我想要的完整数据集将是约 8000 万行。
我怎样才能加快这个查询,以便我可以在合理的时间内以我需要的格式获取数据?
编辑:示例输入数据
Levels Table
gauge_id year month day level
201001 1957 6 22 0.485
201001 1957 6 23 0.759
201001 1957 6 24 0.864
565753 2001 12 4 1.984
Rainfall Table
station_id year month day rainfall
123456 1957 6 22 0
123456 1957 6 23 75.4
123456 1957 6 24 20.2
987654 1986 1 16 0
Gauges Table
gauge_id nearest_station
201001 123456
565753 764892
876544 987654
示例输出数据:
gauge_id station_id Level Level-1 Level-2 Rainfall Rainfall-1
201001 123456 0.864 0.759 0.485 20.2 75.4