как рассчитать максимальное и минимальное среднее и медиану в данные mysql - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть 1 таблица с именем order_match, которая содержит order_buyer_Id в качестве идентификатора транзакции, созданный в качестве идентификатора покупателя, и созданный в качестве даты, когда транзакция произойдет.

в этом случае я хочу подсчитать заказ (order_buyer_Id) для каждого покупателя (созданный) и выяснить максимальное и минимальное количество после этого.

это пример данных:

+----------------+-----------+------------+
| order_buyer_id | createdby | createdAt  |
+----------------+-----------+------------+
|          19123 |        19 | 2017-02-02 |
|         193241 |        19 | 2017-02-02 |
|         123123 |        20 | 2017-02-02 |
|          32242 |        20 | 2017-02-02 |
|          32434 |        20 | 2017-02-02 |
+----------------+-----------+------------+

и, если запустить синтаксис, ожидаемый результат:

+-----+-----+---------+--------+
| max | min | average | median |
+-----+-----+---------+--------+
|   3 |   2 |     2,5 |      3 |
+-----+-----+---------+---------

я использую с этим синтаксисом

select max(count(order_buyer_id)), min(count(order_buyer_id)), avg(count(order_buyer_id)), median(count(order_buyer_Id)) from order_match where createdby = 19 and 20 and createdAt = '2017-02-02' group by createdby;

1 Ответ

1 голос
/ 24 февраля 2020

Большая часть того, что вы хотите сделать, проста, но для вычисления медианных значений вам нужна функция ROW_NUMBER, которую вы должны смоделировать с помощью переменных в MySQL 5.7. Вычислив номер строки (основываясь на порядке упорядочения), вы можете получить либо среднее число (если есть нечетное число значений), либо среднее значение двух средних значений (если есть четное количество значений), чтобы получить медиана Используя условное агрегирование, мы можем затем вычислить медиану одновременно с другими значениями:

SELECT MAX(count) AS max,
       MIN(count) AS min,
       AVG(count) AS average,
       AVG(CASE WHEN rn IN (FLOOR((@tr+1)/2), FLOOR((@tr+2)/2)) THEN count END) AS median
FROM (
  SELECT count, 
         @rn := @rn + 1 AS rn,
         @tr := @rn AS tr
  FROM (
    SELECT COUNT(*) AS count
    FROM order_match
    GROUP BY createdby
    ORDER BY count
  ) o
  CROSS JOIN (SELECT @rn := 0) init
) c

Вывод (для данных выборки):

max     min     average     median
3       2       2.5         2.5

Демонстрация на SQLFiddle

...