加速R中的SQL查询以获取时间序列数据

时间:2017-10-13 11:06:35

标签: r performance sqlite subquery rsqlite

我有一个包含历史河流水位和降雨量数据的数据库。有一个'级别'具有包括测量日期和该日期河流水位在内的属性的表格。还有一场降雨'类似地,该表具有该日期的日期和降雨量等属性。

我想对这些数据进行一些回归(在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个标尺中选择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行,而我想要的完整数据集将是~80万行。

如何加快此查询速度,以便能够在合理的时间内以我需要的格式获取数据?

编辑: 输入数据示例

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

0 个答案:

没有答案