2010-07-20 64 views
0

我有一個表:如何在不使用python或php的情況下計算累計值?

  • LOCATION_ID(location) - 範圍爲0-90,000
  • 時間(time_period) - 1-15範圍爲每個位置
  • 溫度(temp) - 獨特的每個地點的價值x time_period。

示例數據:

location time_period temp 
91   1   -4 
91   2   3 
91   3   12 
....................... 
....................... 
91   15   20 

我想創建一個名爲cum_temp新的領域,併爲每個小區到那當前TIME_PERIOD增加的累計值。我現在的想法是做複製表並運行:

update site_a 
    set cum_temp = (select sum(temp) 
        from site_a_copy 
        where site_a_copy.location = site_a.location 
         and site_a_copy.time_period <= site_a.time_period); 

這是做到這一點的最有效的方式,也可以提出更好的東西?

+0

只是好奇,但到底是什麼溫度的總和是什麼意思?是隻計算平均值嗎?我想不出有什麼好的理由,但我確信我只是心胸狹隘。 – MJB 2010-07-20 02:00:44

+0

這是特定站點在特定時間內的總體溫度。因此,如果我總結時間1到10的所有溫度值,則在時間10時,該特定位置點經歷了等於該總和的累積溫度。我在雪融化和植物生長的情況下使用它。 我沒有用它來計算平均值。 – Maiasaura 2010-07-21 02:07:03

回答

0

請注意,您不需要單獨的表格,除非您不想將累積溫度存儲在其中一個表格中。

定期運行查詢,或手動將工作(儘管從stored procedure做到這一點),或者你可以嘗試使用trigger自動做到這一點:

CREATE TRIGGER sum_temp 
    BEFORE INSERT ON site 
    FOR EACH ROW 
    SET NEW.cum_temp = NEW.temp + (
     SELECT SUM(temp) FROM site 
      WHERE site.location_id = NEW.location_id 
      AND site.`time` < NEW.`time` 
    ); 

不過,觸發該應用程序是充滿了後果自負。首先,上述內容不會更新任何時間上在新行之後的行。只要你添加新記錄,這不是一個嚴重的問題。獲取觸發器來更新後面的行基本上是不可能的,因爲行級鎖可以防止您在INSERT和UPDATE觸發器中向UPDATE發出同一個表。將累積溫度存儲在另一個表格中可以解決這個問題。其次,當用單個INSERT語句插入多個值時,新的行必須在語句中按時間順序排列,否則累積溫度將被錯誤設置。在早些時候在INSERT中計算行的累積溫度時,將不會考慮早於時間點但在INSERT後面的行。這是第一個問題的後果。

你也可以使用一個觀點:

CREATE VIEW site_a AS 
    SELECT *, SUM(temp) AS cum_temp 
     FROM site AS s 
     JOIN site AS t 
     ON s.location_id=t.location_id AND s.time_period >= t.time_period 
; 

參見「UPDATE TABLE WITH SUM

相關問題