У меня есть хранимая процедура, которая возвращает медиану набора, основанного на некоторой группе.
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%.