Mysql 基于时间戳的数据库精确查询
我目前在谷歌大查询数据集中查询价格和时间时遇到了一个准确性问题。我想要的是每五分钟一次的资产价格,但也有一些资产在一分钟内空行 例如,对于VEN和ICX这两种加密货币,可能有一段时间价格数据在特定时间内不可用。在我的查询中,我每300秒查询一次数据库并获取价格数据,但有些资产在5分零秒内没有时间戳。因此,我想得到最后一个已知的价格:一个好的价格应该是4分58秒 我现在的问题是:Mysql 基于时间戳的数据库精确查询,mysql,sql,google-bigquery,time-series,legacy-sql,Mysql,Sql,Google Bigquery,Time Series,Legacy Sql,我目前在谷歌大查询数据集中查询价格和时间时遇到了一个准确性问题。我想要的是每五分钟一次的资产价格,但也有一些资产在一分钟内空行 例如,对于VEN和ICX这两种加密货币,可能有一段时间价格数据在特定时间内不可用。在我的查询中,我每300秒查询一次数据库并获取价格数据,但有些资产在5分零秒内没有时间戳。因此,我想得到最后一个已知的价格:一个好的价格应该是4分58秒 我现在的问题是: SELECT MIN(price) AS PRICE, timestamp FROM [coin_data] WHE
SELECT MIN(price) AS PRICE, timestamp
FROM [coin_data]
WHERE coin="BTCUSD" AND TIMESTAMP_TO_SEC(timestamp) % 300 = 0
GROUP BY timestamp
ORDER BY timestamp ASC
此查询会导致特定位置出现此类间隙:
Row((10339.25, datetime.datetime(2018, 2, 26, 21, 55, tzinfo=<UTC>)))
Row((10354.62, datetime.datetime(2018, 2, 26, 22, 0, tzinfo=<UTC>)))
Row((10320.0, datetime.datetime(2018, 2, 26, 22, 10[should be 5 for 5 min], tzinfo=<UTC>)))
Row((10339.25,datetime.datetime(2018,2,26,21,55,tzinfo=))
行((10354.62,datetime.datetime(2018,2,26,22,0,tzinfo=))
行((10320.0,datetime.datetime(2018,2,26,22,10[应该是5,5分钟],tzinfo=))
在最后一列中,此项不应为10,因为这是分钟位置,它应为5分钟。要选择具有5分钟标记/时间戳(如果存在)的行或最近的现有条目,可以使用(uses
OVER()
)而不是(usesgroupby
),如下所示:
OVER
子句来创建“窗口框架”,并对其中的行进行排序。然后RANK()
标准SQL
遗留SQL
似乎同一时间戳有多个价格,在这种情况下,您可能需要在
子句上方添加另一个字段
OVER(PARTITION BY timegroup, exchange ORDER BY timestamp ASC)
笔记:
SELECT MIN(price) AS min_price, timestamp
FROM (
SELECT *,
RANK() OVER(PARTITION BY timegroup ORDER BY timestamp ASC) AS rank,
FROM (
SELECT *,
INTEGER(FLOOR(TIMESTAMP_TO_SEC(timestamp)/300)) AS timegroup
FROM [coin_data]) AS data )
WHERE rank = 1
GROUP BY timestamp
ORDER BY timestamp ASC
OVER(PARTITION BY timegroup, exchange ORDER BY timestamp ASC)