2011-08-09 54 views
0

我目前正在嘗試處理大塊模擬數據(〜2Gb值)。該數據是在它看起來像一個表:在MySQL中,如何編寫查詢以從另一個表中的位置選擇數據範圍?

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個時間步)。

杜林模擬運行,有發生的事件。這些事件的時間步驟都記錄在另一個表:那麼對於這組數據,與run_id 1

Table: Simulation Events 
+-------+--------+----------+ 
| id | run_id | timestep | 
+-------+--------+----------+ 
| 1 | 1 | 152  | 
| 2 | 1 | 193  | 
| 3 | 1 | 382  | 
| : | : | :  | 
| 143 | 1 | 9382 | 
| 144 | 2 | 137  | 
| : | : | :  | 
+-------+--------+----------+ 

,有時間步152,193,382,...事件9382. run_id 2有了第一位事件在時間步驟137等。我對每個run_id之前的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

有這個兩個角度不同點:

  • 您可以使用空連接(笛卡爾乘積)select ... from table t1, table t2 where ...,但你必須弄清楚,連接兩排一個條件,當且僅當他們」重新「相關」。另外請記住,在您的示例中對是可交換的,因此添加一個條件,如t1.id<t2.id - 也不包括自連接。
  • 或者您可以在存儲過程中使用遊標,並存儲以前的n步驟的值,並手動關聯它們。這比較慢,使用更多的內存,但寫起來更容易。
+0

@ Blindy-當您在存儲過程中提到使用遊標時。你的意思是沿着從事件表run_id = x選擇時間步的方法,並迭代這些值,從模擬數據表中選擇範圍?還是你有其他想法? – MarkD

+0

一旦你有了你的遊標,你就可以爲每一步運行額外的查詢,或者只是將一些變量(或臨時表)中的前一行(幾行)存儲起來,並在現場進行聚合。我真的認爲你不應該走這條路線! – Blindy

+0

我同意 - 聽起來很慢。雖然我一直在試圖弄清楚如何爲第一個例子做這些連接,並且我無處可去。我會讀空白的連接,看看我想出了什麼。感謝您的建議! – MarkD

相關問題