SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.03.2012 12:26:49

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Исключение макс/мин значений из AVG

Наверно как обычно, есть какое то элегантное решение, но ничего в голову не приходит, посоветуйте ))

есть набор чисел в столбце, допустим так
cnt    numb
2    1
6    2
11    3
15    4
14    5
13    6
22    7
15    8
12    9

Надо получить AVG(cnt) но без крайних значений, т.е. без 2 и 22.
Спасибо заранее ))

upd. а если можно параметризовать, т.е. например по два значения исключать или три крайних - то вообще конечно ляпота )

Отредактированно Shopen (05.03.2012 12:37:57)

Неактивен

 

#2 05.03.2012 13:57:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Исключение макс/мин значений из AVG

В голову приходит только через подзапросы. Т.е. найти id строк-ограничителей
и between.

Неактивен

 

#3 05.03.2012 16:56:14

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Исключение макс/мин значений из AVG

а там нет ID - данная таблица это результат вот такого запроса:

SELECT COUNT(*) cnt, WEEKOFYEAR(order_date) numb
FROM `order`
GROUP BY WEEKOFYEAR(order_date)

Неактивен

 

#4 05.03.2012 17:32:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Исключение макс/мин значений из AVG

HAVING WEEKOFYEAR(order_date) BETWEEN 3 AND сколькотамнедельвгоду - 3?

UPD: А, туплю, максимум не в этом месте. Но всё равно, WEEKOFYEAR тогда —
вполне себе нужная чиселка. Разве что прийдется завести временную табличку.

Неактивен

 

#5 05.03.2012 17:35:29

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Исключение макс/мин значений из AVG

Хм... нет, мне же выбросить нужно не первые и последние N-недель, мне нужно выбросить максимальный и минимальный cnt (как при статистических расчетах - крайние значения выборки удаляются)

Неактивен

 

#6 05.03.2012 18:00:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Исключение макс/мин значений из AVG

Если значения не повторяются, то так:

(SUM(cnt)-MAX(cnt)-MIN(cnt))/(SUM(1)-2)

Если могут повторяться, то нужно это обобщить, но подзапросом

Неактивен

 

#7 05.03.2012 19:12:32

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Исключение макс/мин значений из AVG

Все верно, это решается подзапросом.

SELECT AVG(d.numb) FROM(
  SELECT COUNT(*) cnt, WEEKOFYEAR(order_date) numb,(@a:=@a+1) 'pid'
  FROM `order`,(SELECT @a:=0) m
  GROUP BY WEEKOFYEAR(order_date) ORDER BY COUNT(*)
) d WHERE d.pid!=@a AND d.pid!=1

Отредактированно evgeny (05.03.2012 19:14:50)

Неактивен

 

#8 05.03.2012 19:27:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Исключение макс/мин значений из AVG

evgeny, не совсем так. Если максимальном значению соответствуют две строки, то не сработает. Нужно
а) посчитать сумму всех, не равных максимальному и минимальному
б) посчитать число записей, не равных максимальному и минимальному

Лучше всего двумя запросами

SELECT min(cnt),max(cnt) FROM table INTO @min, @max;
SELECT AVG(cnt) FROM table WHERE cnt!=@min AND cnt!=@max;

Неактивен

 

#9 06.03.2012 12:29:22

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Исключение макс/мин значений из AVG

rgbeast написал:

evgeny, не совсем так. Если максимальном значению соответствуют две строки, то не сработает. Нужно
а) посчитать сумму всех, не равных максимальному и минимальному
б) посчитать число записей, не равных максимальному и минимальному

Лучше всего двумя запросами

SELECT min(cnt),max(cnt) FROM table INTO @min, @max;
SELECT AVG(cnt) FROM table WHERE cnt!=@min AND cnt!=@max;

Верно smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson