Выберите строки из MySQL за последние 24 часа и пропустите строки на основе интервала X? - PullRequest
0 голосов
/ 18 декабря 2018

Я создал торгового бота и использую MySQL для импорта данных и расчета технических индикаторов. Я хочу создать функцию, которая позволит мне импортировать данные чаще и контролировать интервал выбора данных.

Есть ли запрос, который позволит мне выбирать данные с фиксированным интервалом в mysql?

SELECT * FROM PriceHistory 
WHERE `RefrenceID`=1001
and `TimeStamp` > (SELECT max(`TimeStamp`) FROM PriceHistory) - 
Interval 1440 Minute
Group by `TimeStamp`;

Используя этот запрос явозможность выбора ценовых данных за последние 24 часа.Есть ли решение для меня, чтобы выбрать данные с интервалами 5 минут, 10 минут, 30 минут и т. Д.?

DataSet Example

`TimeStamp`            `RefrenceID`

1. 2018-12-14 23:00:05   1001
2. 2018-12-14 23:05:10   1001
3. 2018-12-14 23:11:16   1001
4. 2018-12-14 23:16:21   1001
5. 2018-12-14 23:21:25   1001
6. 2018-12-14 23:26:30   1001
7. 2018-12-14 23:32:41   1001
8. 2018-12-14 23:37:46   1001
9. 2018-12-14 23:42:51   1001
10. 2018-12-14 23:47:51   1001
11. 2018-12-14 23:52:56  1001

Я подумал о двух возможных решениях, к сожалению, я еще не понял, как их реализовать.

  1. добавитьauto-increment-id для моей таблицы, создайте запрос, который выбирает номер строки.создайте локальную переменную @rownum и выделите все строки, где @rownum = @rownum + (интервал).

  2. Выберите первую метку времени, создайте локальные переменные @start_time, @offset, @count затем выберите min (TimeStamp)> @start_time + INTERVAL (@offset * @count) MINUTE

Проблемы, с которыми я сталкиваюсь при использовании автоматического увеличенияРешение с использованием идентификаторов заключается в том, что я отслеживаю цену 220 элементов в одной и той же таблице (поэтому последовательные идентификаторы не будут работать), и поэтому может потребоваться создание новой строки индекса в начале запроса.Другая проблема, с которой я сталкиваюсь, заключается в том, что мой код является синхронным, и поэтому из-за других запущенных процессов каждый импорт данных занимает от 5 минут до 5 минут 30 секунд.

спасибо за вашу помощь!

С наилучшими пожеланиями,

slurp

Expected output:

1. 2018-12-14 23:00:05   1001
3. 2018-12-14 23:11:16   1001
5. 2018-12-14 23:21:25   1001
7. 2018-12-14 23:32:41   1001
9. 2018-12-14 23:42:51   1001
11. 2018-12-14 23:52:56  1001

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018
SELECT * 
FROM PriceHistory 
WHERE 
    `RefrenceID`=1001
    AND `TimeStamp` > (SELECT max(`TimeStamp`) FROM PriceHistory) - Interval 1440 Minute
    AND substring_index(TimeStamp,':',1)%5=0
GROUP BY `TimeStamp`;
0 голосов
/ 18 декабря 2018

Используя оконные функции (MySQL-8.0, MariaDB-10.2), мы DIV 600 делим с интервалом в 10 минут (600 секунд).Мы берем первое в каждой группе по id.

SELECT id, entrytime, RefrenceID
FROM ( 
  SELECT 
    id, entrytime, RefrenceID,
    ROW_NUMBER() OVER (PARTITION BY RefrenceID,UNIX_TIMESTAMP(entrytime) DIV 600 ORDER BY id) AS `rank`
  FROM timedata 
  ORDER BY id 
) AS tmp 
WHERE tmp.`rank` = 1
ORDER BY id, entrytime;

Ref: dbfiddle

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