在MySQL中,如何编写查询以从另一个表中的位置选择数据范围?

时间:2011-08-09 13:35:55

标签: mysql

我目前正在尝试处理一大块模拟数据(价值约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,等等。有关组合查询的任何想法会做到这一点吗?

1 个答案:

答案 0 :(得分:1)

对此有两种截然不同的观点:

  • 您可以使用空白联接(笛卡尔积)select ... from table t1, table t2 where ...,但是当且仅当它们“相关”时,您必须找出链接两行的条件。另请注意,在您的示例中,对是可交换的,因此添加类似t1.id<t2.id的条件 - 也会排除自连接。
  • 或者您可以在存储过程中使用游标,并存储先前n步骤的值,并手动关联它们。这个速度较慢,使用的内存较多,但编写起来比较容易。