количество без использования группы функций mysql - PullRequest
0 голосов
/ 19 марта 2020

У меня есть такая таблица,

CREATE TABLE order_match
    (`order_buyer_id` int, `createdby` int, `createdAt` datetime, `quantity` decimal(10,2))
;

INSERT INTO order_match
    (`order_buyer_id`, `createdby`, `createdAt`, `quantity`)
VALUES
    (19123, 19, '2017-02-02', 5),
    (193241, 19, '2017-02-03', 5),
    (123123, 20, '2017-02-03', 1),
    (32242, 20, '2017-02-04', 4),
    (32434, 20, '2017-02-04', 5),
    (2132131, 12, '2017-02-02', 6)
;

вот скрипка для этой таблицы, order_buyer_id - это идентификатор транзакции, созданный покупателем, созданный, это время каждой транзакция, количество - это количество транзакции

Я хочу узнать максимум, минимум, медиану и среднее для каждого повторного заказа (покупатель с транзакцией> 1)

, поэтому в этой таблице ожидаемые результаты такие же

+-----+-----+---------+--------+
| MAX | MIN | Average | Median |
+-----+-----+---------+--------+
|   3 |   2 |     2.5 |      3 |
+-----+-----+---------+--------+

примечание: я использую mysql 5,7

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

select -- om.createdby, om.quantity, x1.count_
       MAX(count(om.createdby)) AS max,
       MIN(count(om.createdby)) AS min,
       AVG(count(om.createdby)) AS average
  from (select count(xx.count_) as count_
          from (select count(createdby) as count_ from order_match
                 group by createdby
                 having count(createdby) > 1) xx
        ) x1,
        (select createdby
           from order_match
          group by createdby
          having count(createdby) > 1) yy,
        order_match om
 where yy.createdby = om.createdby
   and om.createdAt <= '2017-02-04'
   and EXISTS (select 1 from order_match om2
                where om.createdby = om2.createdby
                  and om2.createdAt >= '2017-02-02'
                  and om2.createdAt <= '2017-02-04')

, но говорится

Invalid use of group function

1 Ответ

1 голос
/ 19 марта 2020

Мы можем попробовать агрегировать по createdby, а затем взять нужные вам агрегаты:

SELECT
    MAX(cnt) AS MAX,
    MIN(cnt) AS MIN,
    AVG(cnt) AS Average
FROM
(
    SELECT createdby, COUNT(*) AS cnt
    FROM order_match
    GROUP BY createdby
    HAVING COUNT(*) > 0
) t

Имитировать медиану в MySQL 5.7 - это много работы и уродливо. Если у вас есть долгосрочная потребность в медиане, рассмотрите возможность повышения до MySQL 8 +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...