WedX - журнал о программировании и компьютерных науках

Как я могу вернуть числовые данные коробчатой ​​диаграммы всех результатов, используя 1 запрос mySQL?

[tbl_votes]
- id <!-- unique id of the vote) -->
- item_id <!-- vote belongs to item <id> -->
- vote <!-- number 1-10 -->

Конечно, мы можем это исправить, получив:

  • smallest observation (так)
  • lower quartile (lq)
  • median (я)
  • upper quartile (uq)
  • и largest observation (lo)

..один за другим с использованием нескольких запросов, но мне интересно, можно ли это сделать с помощью одного запроса.

В Oracle я могу использовать COUNT OVER и RATIO_TO_REPORT, но в mySQL это не поддерживается.

Для тех, кто не знает, что такое коробчатая диаграмма: https://en.wikipedia.org/wiki/Box_plot

Любая помощь будет оценена.

26.12.2011


Ответы:


1

Вот пример расчета квартилей для e256 диапазонов значений в e32 группах, индекс на (e32, e256) в этом случае является обязательным:

SELECT
  @group:=IF(e32=@group, e32, GREATEST(@index:=-1, e32)) as e32_,
  MIN(e256) as so,
  MAX(IF(lq_i=(@index:=@index+1), e256, NULL)) as lq,
  MAX(IF(me_i=@index, e256, NULL)) as me,
  MAX(IF(uq_i=@index, e256, NULL)) as uq,
  MAX(e256) as lo
FROM (SELECT @index:=NULL, @group:=NULL) as init, test t
JOIN (
  SELECT e32,
    COUNT(*) as cnt,
    (COUNT(*) div 4) as lq_i,    -- lq value index within the group
    (COUNT(*) div 2) as me_i,    -- me value index within the group
    (COUNT(*) * 3 div 4) as uq_i -- uq value index within the group
  FROM test
  GROUP BY e32
) as cnts
USING (e32)
GROUP BY e32;

Если группировки не нужны, запрос будет немного проще.

P.S. test - моя игровая таблица случайных значений, где e32 - результат int(random.expovariate(1.0) * 32) Python и т. Д.

04.01.2012

2

Я нашел решение в PostgreSQL, используя PL / Python.

Однако я оставляю вопрос открытым на тот случай, если кто-то другой предложит решение в mySQL.

CREATE TYPE boxplot_values AS (
  min       numeric,
  q1        numeric,
  median    numeric,
  q3        numeric,
  max       numeric
);

CREATE OR REPLACE FUNCTION _final_boxplot(strarr numeric[])
   RETURNS boxplot_values AS
$$
    x = strarr.replace("{","[").replace("}","]")
    a = eval(str(x))

    a.sort()
    i = len(a)
    return ( a[0], a[i/4], a[i/2], a[i*3/4], a[-1] )
$$
LANGUAGE 'plpythonu' IMMUTABLE;

CREATE AGGREGATE boxplot(numeric) (
  SFUNC=array_append,
  STYPE=numeric[],
  FINALFUNC=_final_boxplot,
  INITCOND='{}'
);

Пример:

SELECT customer_id as cid, (boxplot(price)).*
FROM orders
GROUP BY customer_id;

   cid |   min   |   q1    | median  |   q3    |   max
-------+---------+---------+---------+---------+---------
  1001 | 7.40209 | 7.80031 |  7.9551 | 7.99059 | 7.99903
  1002 | 3.44229 | 4.38172 | 4.72498 | 5.25214 | 5.98736

Источник: https://www.christian-rossow.de/articles/PostgreSQL_boxplot_medianpregate_quartile_function а>

26.12.2011

3

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

mysql> select (select floor (count (*) / 4)) as first_q, (select floor (count (*) / 2) from customer_data) as mid_pos, (select floor (count (*) / 4 * 3) from customer_data ) как third_q из заказа customer_data по пределу измерения 1;

mysql> выберите min (мера), (выберите меру из порядка customer_data по пределу измерения 0,1) в качестве firstq, (выберите меру из порядка customer_data по пределу измерения 5,1) в качестве медианы (выберите меру из порядка customer_data по пределу измерения 8 , 1) как last_q, max (мера) из customer_data;

04.01.2012
  • как вы используете свои позиции первого запроса во втором запросе? 14.01.2016
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]