Как я могу найти пробелы в метках времени в SQL (для скребка данных) - PullRequest
0 голосов
/ 25 февраля 2019

Я очень новичок в работе с БД / SQL и прилагаю все усилия, чтобы отрегулировать. Я использую SQLAlchemy / Postgres для записи данных из API-интерфейса Python, в который я записываю рыночные данные каждые 10 минут (вставляются в БД).Этот скребок предназначен для получения запасных минутных «свечей», поэтому каждый раз в него следует вставлять по 10 рядов.Я запустил его прошлой ночью и заметил, что цифры немного искажены, в этом я сделал SELECT count(*) FROM exchange WHERE market='x_market'; в pgcli, и я получил счет 900, где он должен быть около 1000 (начал работать 1k минут назад).По сути, что я хочу сделать (если это возможно), чтобы увидеть, есть ли какие-либо промежутки (данные, которые он не уловил) между строками.Каждая строка имеет метку времени Unix, и каждая метка времени «под ней» должна отличаться на 60000 мс (1 мин).Я знаю, что в Python я мог бы просто пройтись по нему и проверить это, но мне интересно узнать больше о SQL (было бы гораздо приятнее просто проверить pgcli).Можно ли это проверить (с помощью SQL)?Я прилагаю скриншот, чтобы показать схему / что я имею в виду.Большое спасибо заранее.

(для рис. Отметка времени (unix) - это первый столбец, а остальные - только данные о цене акций) enter image description here

1 Ответ

0 голосов
/ 26 февраля 2019

Один из способов получить пропуски или «пропущенные» временные метки - использовать generate_series для создания серии временных меток, разделенных 60000 мс, а затем присоединиться к вашей таблице.Вот так:

-- Simulate some data with a gap
WITH exchange(tstamp, val) AS
(
  VALUES
    (1551118800000, 0.03626),
    (1551118860000, 0.036243),
    (1551118980000, 0.03627)
)

-- Return timestamp(s) that do not match to exchange table data
SELECT stamps.tstamp AS missing_timestamp
FROM exchange
RIGHT JOIN generate_series(1551118800000, 1551118980000, 60000) stamps(tstamp)
  ON exchange.tstamp = stamps.tstamp
WHERE exchange.tstamp IS NULL

-- Or using a more explicit anti-JOIN (cleaner?)
SELECT stamps.tstamp AS missing_timestamp
FROM generate_series(1551118800000, 1551118980000, 60000) stamps(tstamp)
WHERE NOT EXISTS (SELECT 1 FROM exchange WHERE tstamp = stamps.tstamp)

Первый аргумент в generate_series - это минимальная отметка времени, а второй - максимум.Вы можете изменить для вашего случая использования.Последний аргумент - это «шаг» (60000 мс).

Результат (с учетом смоделированных данных выше):

missing_timestamp
------
1551118920000
...