2012-01-18 2 views
5

Я хочу написать функцию, которая вычисляет простой вычисляемый средний расчет в MySQL. Функция будет (очевидно) быть агрегатной функцией. Я новичок в написании функций и т. Д. В MySQL, поэтому мог бы с некоторой помощью справиться.Расчет промежуточных вычислений в MySQL

Алгоритм обрезанного среднего будет выглядеть следующим образом (псевдокод):

CREATE AGGREGATE FUNCTION trimmed_mean(elements DOUBLE[], trim_size INTEGER) 
RETURNS DOUBLE 
BEGIN 
    -- determine number of elements 
    -- ensure that number of elements is greater than 2 * trim_size else return error 
    -- order elements in ASC order 
    -- chop off smallest trim_size elements and largest trim_size elements 
    -- calculate arithmetic average of the remaining elements 
    -- return arithmetic average 
END 

Может кто-нибудь помочь с тем, как написать функцию выше правильно, для использования с MySQL?

+2

Есть что вы хотите сделать это как функцию, а не как запрос? Кроме того, учитывая, что вы предпочли ответ на предыдущий вопрос, потому что он использовал стандартный SQL, вам нужно будет использовать его для нескольких разных РСУБД (то есть, а не только для MySQL)? –

+0

@MarkBannister Я намеревался работать с PG (мой любимый db!), Но мне пришлось перепрыгнуть через слишком много обручей, чтобы заставить PG работать с PHP (перекомпилировать PHP [или подобные сумасшедшие просьбы] и т. Д.), Поэтому я выбрал mySQL, который У меня уже есть работа с PHP. Причина, по которой я хотел, чтобы это как функция, заключается в том, что я хочу вернуть обрезанное среднее как столбец в запросе. Я полагаю (если бы у меня было SQL-решение), я мог бы взломать некоторый SQL, чтобы «вставить» обрезанные средние значения в качестве столбца в мой возвращенный набор данных. –

+0

@MarkBannister: короткий ответ на ваш вопрос. Версия ANSI SQL была бы идеальной. Но, поскольку я, случается, работаю с mySQL, тогда, если я __have__ будет db-ориентированным, SQL-код с поддержкой SQL будет иметь приоритет. –

ответ

1

Это не малую задачу, вам нужно записать его в C/C++ ...


Опцион в самой MySQL, это написать представление или скалярную функцию который агрегирует данные, как вы хотите, но из конкретной таблицы. Это, очевидно, ограничивает функцию одной исходной таблицей, что может быть не идеальным.

способ обойти это может быть, чтобы иметь стол, посвященный этой функции ...

  • начать транзакцию
  • ясно таблицу
  • вставить ваши данные выборки
  • запрос на вид/функция

(или что-то подобное)

Это исключает варианты GROUP BY, если вы не используете динамические параметры sql или pass для вашей функции для определенных шаблонов группировки.

Все это не идеально, извините.

+0

Я не против идти по трассе C/C++ (как в крайнем случае), но я бы предпочел не просто потому, что не хочу часами познакомиться с внутренними типами данных mySQL и т. д. Если есть пример «hello world» для совокупности, написанной на C/C++, это было бы очень хорошей отправной точкой (в сокращении кривой обучения), поскольку то, что я хочу сделать, относительно тривиально (часть алгоритма). –

+0

В ссылке от Dems: * «Исходный дистрибутив MySQL включает файл sql/udf_example.c, который определяет 5 новых функций». * –

1

Посмотрите на этот пример (для MySQL) -

Создание тестовой таблицы:

CREATE TABLE test_table (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    value INT(11) DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO test_table(value) VALUES 
    (10), (2), (3), (5), (4), (7), (1), (9), (3), (5), (9); 

Вычислим значение ср (отредактированный вариант):

SET @trim_size = 3; 

SELECT AVG(value) avg FROM (
    SELECT value, @pos:[email protected] + 1 pos FROM (SELECT * FROM test_table ORDER BY value) t1, (SELECT @pos:=0) t2 
) t 
WHERE pos > @trim_size AND pos <= @pos - @trim_size; 

+--------+ 
| avg | 
+--------+ 
| 4.8000 | 
+--------+ 
+0

Несомненно, это должно быть 4.8 - отделка должна устранить одну, но не обе из трех? т.е.: (не (1 + 2 + 3) + 3 + 4 + 5 + 5 + 7 + not (9 + 9 + 10))/5 –

+0

@Mark Bannister Вы правы. Я пропустил элементы точечного заказа в порядке ASC. Его нужно упорядочить по полю 'value'. Я редактировал запрос. Благодаря;-) – Devart

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