Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于时间戳的数据库精确查询_Mysql_Sql_Google Bigquery_Time Series_Legacy Sql - Fatal编程技术网

Mysql 基于时间戳的数据库精确查询

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

我目前在谷歌大查询数据集中查询价格和时间时遇到了一个准确性问题。我想要的是每五分钟一次的资产价格,但也有一些资产在一分钟内空行

例如,对于VEN和ICX这两种加密货币,可能有一段时间价格数据在特定时间内不可用。在我的查询中,我每300秒查询一次数据库并获取价格数据,但有些资产在5分零秒内没有时间戳。因此,我想得到最后一个已知的价格:一个好的价格应该是4分58秒

我现在的问题是:

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()
)而不是(uses
groupby
),如下所示:

  • 将所有行分成“单独”的5分钟组
  • 根据与所需时间的接近程度对其进行排序
  • 从每个分区中选择第一行
  • 这里我使用
    OVER
    子句来创建“窗口框架”,并对其中的行进行排序。然后
    RANK()

    标准SQL 遗留SQL 似乎同一时间戳有多个价格,在这种情况下,您可能需要在
    子句上方添加另一个字段

    OVER(PARTITION BY timegroup, exchange ORDER BY timestamp ASC)
    
    笔记:
  • 考虑标准SQL,这是查询BigQuery中存储的数据时首选的SQL方言。您可以在单个查询的基础上完成,因此不必同时迁移所有内容

  • 我的想法是提供一个通用查询来说明这一原理,这样我就不会过滤空行,因为不清楚它们是null还是空字符串,而且答案也不需要

  • 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)