Совокупное использование данных sql - PullRequest
0 голосов
/ 23 июня 2018

Это определение «exchange» table:

CREATE TABLE `exchange` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rank` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `volume` varchar(255) NOT NULL,
  `timestamp` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=75032 DEFAULT CHARSET=utf8;

Около 209 записей будет храниться каждые 5 минут.

Как я могу получить эту структуру данных?

rank, name, [volume,...](last 144 value), timestamp

Я использую этот запрос:

SELECT `volume`
FROM `exchange`
WHERE `exchange`.`name` = 'binance'
ORDER BY `timestamp` DESC
LIMIT 144

Есть ли лучший способ получить данные один раз?Спасибо.

1 Ответ

0 голосов
/ 23 июня 2018

Честно говоря, ваш метод может быть лучшим, особенно если у вас есть индекс на (name, timestamp).

Вы можете попробовать:

select e.volume
from exchange e
where e.timestamp >= (select e2.timestamp
                      from exchange e2
                      where e2.name = e.name
                      limit 1 offset 143
                     );

Затем вы можете агрегировать значения как:

select e.name, sum(e.volume)
from exchange e
where e.timestamp >= (select e2.timestamp
                      from exchange e2
                      where e2.name = e.name
                      limit 1 offset 143
                     )
group by e.name;

Примечание: в MySQL 8+ это намного проще, используя row_number():

select name, sum(volume)
from (select e.*,
             row_number() over (partition by name order by timestamp desc) as seqnum
      from exchange e
     ) e
where seqnum <= 144
group by name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...