python - 如何在 SQL 中找到时间戳中的间隙(对于数据抓取器)

标签 python sql database postgresql gaps-in-data

我对使用 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)?我附上屏幕截图以显示架构/我的意思。 首先十分感谢。

(图片中,时间戳(unix)为第一列,其余为股价数据) enter image description here

最佳答案

获取间隙或“缺失”时间戳的一种方法是使用 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/

相关文章:

python - 如何使用 Django 发送/获取 JSON 对象?

python - 用户在 Gtk.TreeView 中搜索折叠的行

php - 对于每个 SQL 结果,另一个 SQL 查询?在 PHP 中

database - 如何克服 Netezza 缺乏唯一约束/参照完整性实现的问题?

mysql workbench 迁移具有两个不同名称的数据库

database - ORM vs 传统数据库查询,它们的领域是什么?

python - 通过 Flask 应用程序的 Cherrypy 调度获取正确的静态 URL

python - 如何在一个文件的一行中输出 3 个项目?

mysql - MySQL 数据类型中的内存分配?

php - 如何检查存储在数据库中的数组中是否存在值