Как выполнить этот запрос внутри хранимой процедуры, когда используются переменные сеанса - PullRequest
1 голос
/ 29 апреля 2011

Я нашел этот запрос для рассчитать медианы

@myvar:=0;
@rownum:=0;
SELECT result.readdate, 
       AVG(total_gallons) AS total_gallons 
FROM   (SELECT middle_rows.readdate, 
               numerated_rows.rownum, 
               numerated_rows.total_gallons 
        FROM   (SELECT IF(@myvar = readdate, @rownum := @rownum + 1, @rownum := 0) AS rownum,
                       @myvar := readdate                                          AS readdate_alias,
                       total_gallons 
                FROM   _temp_total_gallons 
                ORDER  BY readdate, 
                          total_gallons) numerated_rows, 
               (SELECT readdate, 
                       COUNT(*) / 2 median 
                FROM   _temp_total_gallons
                GROUP  BY readdate) middle_rows 
        WHERE  numerated_rows.rownum BETWEEN ( middle_rows.median - IF(median = ROUND(median), 1, 0) - 0.5 ) AND ( middle_rows.median - IF(median = ROUND(median), 0, 0.5) )
               AND numerated_rows.readdate_alias = middle_rows.readdate) result
GROUP  BY readdate

Как вы видите, он использует @myvar и @rownum в качестве переменных сеанса SELECT IF(@myvar = readdate, @rownum := @rownum + 1, @rownum := 0)

Проблема в том, что не удается запустить это внутри хранимой процедуры, потому что синтаксис @myvar:=0 неизвестен, и я должен указать / установить время выполнения внутри выбора.

Как бы вы переписали приведенный выше запрос для использования в хранимой процедуре?

Пример данных для тестирования и запрос можно найти по адресу https://gist.github.com/948250
Второй набор данных для тестирования здесь https://gist.github.com/25b991396d0dd6968b7e

1 Ответ

1 голос
/ 29 апреля 2011

Используйте

SET @myvar := 0;

внутри SP, чтобы присвоить значение:

DELIMITER $$

CREATE PROCEDURE prc_median()
BEGIN
SET @myvar:=0;
SET @rownum:=0;
SELECT result.readdate,
       AVG(total_gallons) AS total_gallons
FROM   (SELECT middle_rows.readdate,
               numerated_rows.rownum,
               numerated_rows.total_gallons
        FROM   (SELECT IF(@myvar = readdate, @rownum := @rownum + 1, @rownum := 0) AS rownum,
                       @myvar := readdate                                          AS readdate_alias,
                       total_gallons
                FROM   _temp_total_gallons
                ORDER  BY readdate,
                          total_gallons) numerated_rows,
               (SELECT readdate,
                       COUNT(*) / 2 median
                FROM   _temp_total_gallons
                GROUP  BY readdate) middle_rows
        WHERE  numerated_rows.rownum BETWEEN ( middle_rows.median - IF(median = ROUND(median), 1, 0) - 0.5 ) AND ( middle_rows.median - IF(median = ROUND(median), 0, 0.5) )
               AND numerated_rows.readdate_alias = middle_rows.readdate) result
GROUP  BY readdate;
END;
$$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...