我对使用 DB/SQL 非常陌生,并尽最大努力进行调整我正在使用 SQLAlchemy/Postgres 从 Python API 写入数据,我每 10 分钟写入一次市场数据(插入数据库)。此刮板旨在获取库存分钟“蜡烛”,因此每次应将 10 行插入每个库存。我昨晚开始运行它并注意到数字有点偏离,因为我在 pgcli 中执行了 SELECT count(*) FROM exchange WHERE market='x_market';
并且我得到了 900 的计数,它应该在 1000 左右(1k 分钟前开始运行)。本质上,我想要做的(如果可能的话)是查看行之间是否有任何间隙(它没有捕获的数据)。每行都有一个 unix 时间戳,“它下面”的每个时间戳应该相差 60000 毫秒(1 分钟)。我知道在 Python 中我可以遍历并检查它,但我有兴趣了解更多关于 SQL 的知识(只检查 pgcli 会更好)。是否可以检查这个(使用 SQL)?我附上屏幕截图以显示架构/我的意思。
首先十分感谢。
最佳答案
获取间隙或“缺失”时间戳的一种方法是使用 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
关于python - 如何在 SQL 中找到时间戳中的间隙(对于数据抓取器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873714/