Я хочу улучшить производительность моего запроса или более эффективный дизайн запроса, чтобы получить минимальные, максимальные и количественные значения для группы в таблице mysql.
Требуемый вывод:
+---------+----------+----------+-----+
| id | f_amount | r_amount | cnt |
+---------+----------+----------+-----+
| 1 | 1000 | 200 | 3 |
| 2 | 300 | 300 | 1 |
| 3 | 450 | 600 | 2 |
+---------+----------+----------+-----+
где f_amount - самая старая сумма, r_amount - самая последняя сумма, а cnt - количество транзакций для этого конкретного идентификатора.
Мой запрос [который получает желаемый результат, но очень медленный].В моей таблице содержится около 1 миллиарда записей, и каждый идентификатор имеет тысячи транзакций, и все данные находятся в MySQL.
Я не могу реализовать то же самое с помощью общего выражения таблицы.
SELECT x.fund_id AS id,
min_amt AS f_amount,
max_amt AS r_amount,
z.cnt
FROM (
SELECT fund_id,
amount AS min_amt,
dt
FROM trans
WHERE dt =
(
SELECT Min(dt)
FROM trans g
WHERE g.fund_id = trans.fund_id)) x
INNER JOIN
(
SELECT fund_id,
amount AS max_amt,
dt
FROM trans
WHERE dt =
(
SELECT Max(dt)
FROM trans g
WHERE g.fund_id = trans.fund_id)) y
INNER JOIN
(
SELECT fund_id,
Count(fund_id) AS cnt
FROM trans g
GROUP BY 1) z
where x.fund_id = y.fund_id
AND x.fund_id = z.fund_id
ORDER BY x.fund_id;
Создание таблицы и вставка образца данных:
CREATE TABLE trans (
fund_id int,
amount int,
dt date);
insert into trans values(1,1000,'2019-02-01');
insert into trans values(1,500,'2019-02-02');
insert into trans values(1,200,'2019-02-03');
insert into trans values(2,300,'2019-02-15');
insert into trans values(3,450,'2019-02-17');
insert into trans values(3,600,'2019-02-20');