Как рассчитать максимальный, минимальный, средний и медиана количества заказа - PullRequest
0 голосов
/ 25 февраля 2020

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

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

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

+----------------+-----------+------------+--------+
| order_buyer_id | createdby | createdAt  |quantity|
+----------------+-----------+------------+--------+
|          19123 |        19 | 2017-02-02 |0.4     |
|         193241 |        19 | 2017-02-02 |0.5       
|         123123 |        20 | 2017-02-02 |1       |
|          32242 |        20 | 2017-02-02 |4
|          32434 |        20 | 2017-02-02 |3       |
+----------------+-----------+------------+---------

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

+-----+-----+---------+--------+
| max | min | average | median |
+-----+-----+---------+--------+
|   4 | 0.4 |    1,78 |      1 |
+-----+-----+---------+---------

Это скрипка

http://www.sqlfiddle.com/#! 9 / d89772 / 15

и это мой запрос

SELECT MAX(quantity) AS max,
       MIN(quantity) AS min,
       AVG(quantity) AS average,
       AVG(CASE WHEN rn IN (FLOOR((@tr+1)/2), FLOOR((@tr+2)/2)) THEN quantity 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 order_buyer_Id
    order by quantity
  ) o
  CROSS JOIN (SELECT @rn := 0) init
) c

Ответы [ 2 ]

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

Вы получаете ошибку, потому что quantity отсутствует в вашем subquery.

Либо вы снова объединяетесь со своей таблицей, чтобы получить quantity, либо можете включить количество в вас select (на основе ваших выборочных данных даже group by с количеством дает тот же результат )

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

SQL FIDDLE

0 голосов
/ 25 февраля 2020

ВЫБРАТЬ t.max, t.min, t.werage, 0.00 AS 'Медиана'

ОТ (ВЫБРАТЬ МАКС. (Количество) AS max,

   MIN(quantity) AS min,

   SUM(quantity)/COUNT(distinct created_by) AS average

ОТ order_match) t

объединение

ВЫБРАТЬ 0,00 AS 'max', 0,00 AS 'min', 0,00 AS 'Среднее',

((2 * t1.average / 3) + t1 .mode) AS 'Median'

FROM (счетчик SELECT (FLOOR (количество)), IFNULL (FLOOR (количество), min (количество)) AS "mode"

FROM order_match количество HAVING

count (FLOOR (количество))> 1) t1

...