Переписать хранимую процедуру, чтобы вернуть вместо медианы (50%) элементы в позиции 20% / 30% и т. Д. - PullRequest
1 голос
/ 02 мая 2011

У меня есть хранимая процедура, которая возвращает медиану набора, основанного на некоторой группе.

SET @myvar:='1';
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 := IFNULL(@rownum,0) + 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;

Как вы видите, это использует предложение BETWEEN, чтобы вернуть строки между позициями на 50%.Если несколько строк найдено (даже установлено), то внешнее выделение имеет среднее значение.

Я пытался изменить COUNT(*) / 2 median на COUNT(*) / 5 median, но запрос возвращает намного меньший набор данных, вероятно, потому что предложение Междуслишком строгий и не отражает 20%.

В наборе типа:

1 (2) 3 4 5 6 7 8 9 100 110

Число 2 на 20%.

В будущем я хотел быСкрипт, который можно использовать для возврата любого выбранного процента, например, элемента на 30% или 40%.

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Посмотрите информацию на следующей странице, SQL может рассчитать любой процентиль, который вы пожелаете

http://rpbouman.blogspot.com/2008/07/calculating-nth-percentile-in-mysql.html

Я сам использовал это во многих областях, и это работает очень хорошо. Вам просто нужно быть осторожным со значением параметра 'group_concat_max_len', так как слишком малое значение может испортить ваши результаты.

Надеюсь, это поможет!

Dave

0 голосов
/ 02 мая 2011

Проблема в предложении BETWEEN, как вы и поняли. Вместо этого попробуйте следующее предложение МЕЖДУ:

WHERE  numerated_rows.rownum  BETWEEN ( middle_rows.median - 1.0001 ) AND ( middle_rows.median - 0.0001) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...