我对使用 DB/SQL 非常陌生,并尽我所能进行调整我正在使用 SQLAlchemy/Postgres 从 Python API 写入数据,我每 10 分钟写入一次市场数据(插入 DB)。该刮刀旨在获取库存分钟“蜡烛”,因此每次应在每个库存中插入 10 行。我昨晚开始运行它,发现数字有点不对,因为我做了一个SELECT count(*) FROM exchange WHERE market='x_market';
在 pgcli 中,我得到了 900 的计数,它应该在 1000 左右(1k 分钟前开始运行)。本质上,我想做的(如果可能的话)是看看行之间是否有任何间隙(它没有捕获的数据)。每行都有一个 unix 时间戳,并且每个“低于它”的时间戳应该是 60000 毫秒(1 分钟)不同。我知道在 Python 中我可以迭代并检查它,但我有兴趣了解更多关于 SQL 的信息(如果只检查 pgcli 会更好)。是否可以检查(使用 SQL)?我附上一个屏幕截图来显示架构/我的意思。首先十分感谢。
问问题
199 次
1 回答
1
获取间隙或“缺失”时间戳的一种方法是使用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
于 2019-02-25T21:23:55.957 回答