我目前正在尝试处理一大块模拟数据(价值约2Gb)。数据位于表格中,如下所示:
Table: Simulation Data
+-------+--------+----------+-------+
| id | run_id | timestep | value |
+-------+--------+----------+-------+
| 1 | 1 | 1 | 0.00 |
| 2 | 1 | 2 | 0.003 |
| : | : | : | : |
| 9543 | 1 | 9543 | 0.23 |
| 9544 | 2 | 1 | 0.00 |
| : | : | : | : |
+-------+--------+----------+-------+
因此,对于每次运行(由run_id标识),有许多时间步骤和相应的数据(在run_id 1的情况下,有9543个时间步骤。)
在模拟运行中,会发生一些事件。这些事件时间步骤记录在另一个表中:
Table: Simulation Events
+-------+--------+----------+
| id | run_id | timestep |
+-------+--------+----------+
| 1 | 1 | 152 |
| 2 | 1 | 193 |
| 3 | 1 | 382 |
| : | : | : |
| 143 | 1 | 9382 |
| 144 | 2 | 137 |
| : | : | : |
+-------+--------+----------+
对于这组数据,使用run_id 1,在时间步骤152,193,382,... 9382处有事件。在步骤137,run_id 2有第一个事件,等等。我对发生的事情感兴趣在每个run_id之前的3个步骤,每个事件之后的3个时间步长和3个时间步。我想把一个返回看起来像的东西放在一起:
+--------+----------------+----------+-------+
| run_id | event_timestep | delta_ts | value |
+--------+----------------+----------+-------+
| 1 | 152 | -3 | 0.053 |
| 1 | 152 | -2 | 0.042 |
| 1 | 152 | -1 | 0.031 |
| 1 | 152 | 0 | 0.003 |
| 1 | 152 | 1 | 0.532 |
| 1 | 152 | 2 | 0.736 |
| 1 | 152 | 3 | 1.138 |
| 1 | 193 | -3 | 0.049 |
| : | : | : | : |
| 1 | 9382 | -3 | 0.068 |
| : | : | : | : |
| 1 | 9382 | 3 | 1.523 |
+--------+----------------+----------+-------+
第一行,delta_ts = -3将是来自时间步长149的值,-2将来自时间步长150,-1来自时间步长151,等等。有关组合查询的任何想法会做到这一点吗?
答案 0 :(得分:1)
对此有两种截然不同的观点:
select ... from table t1, table t2 where ...
,但是当且仅当它们“相关”时,您必须找出链接两行的条件。另请注意,在您的示例中,对是可交换的,因此添加类似t1.id<t2.id
的条件 - 也会排除自连接。n
步骤的值,并手动关联它们。这个速度较慢,使用的内存较多,但编写起来比较容易。