2010-07-20 3 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

+0

Это общая температура, на которой какой-либо конкретный сайт имеет опыт до определенного времени. Поэтому, если подытожить все значения температуры от 1 до 10, в момент времени 10 этот конкретный сайт местоположения испытал кумулятивную температуру, равную этой сумме. Я использую его в контексте таяния снега и роста растений. Я не использую его для вычисления среднего. – Maiasaura

ответ

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` 
    ); 

Однако триггеры для этого приложения чреваты опасность. Во-первых, вышесказанное не будет обновлять строки, которые временно появляются после новой строки. Пока вы добавляете новые записи, это не является серьезной проблемой. Получение триггера для обновления последующих строк в принципе невозможно, поскольку блокировки на уровне строк не позволяют вам выпускать UPDATE в одну и ту же таблицу в триггерах INSERT и 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»

Смежные вопросы