【问题标题】:Querying distinct timestamps from column in Google's Big Query从 Google Bigquery 的列中查询不同的时间戳
【发布时间】:2018-07-29 19:21:25
【问题描述】:

我正在从价格数据库中选择数据。我要查询的行是每整分钟发生一次的行,而且很明显。所以,如果有一分钟有两个价格,我宁愿选择第一个价格。

这个 VVV 查询的数据如下所示:

选择价格、时间戳 FROM [数据库] WHERE stock="appl" AND second(timestamp) = 0 按时间戳排序

结果:

行价格时间戳
1 0.097947 2018-02-14 03:42:00.000 UTC
2 0.09796 2018-02-14 03:43:00.000 UTC
3 0.097959 2018-02-14 03:45:00.000 UTC
4 0.097969 2018-02-14 03:46:00.000 UTC
5 0.097984 2018-02-14 03:47:00.000 UTC
6 0.097986 2018-02-14 03:47:00.000 UTC(重复时间 ^) 7 0.097899 2018-02-14 03:48:00.000 UTC
8 0.097927 2018-02-14 03:49:00.000 UTC
9 0.097984 2018-02-14 03:50:00.000 UTC
10 0.097995 2018-02-14 03:51:00.000 UTC
11 0.097972 2018-02-14 03:52:00.000 UTC
12 0.097924 2018-02-14 03:53:00.000 UTC
13 0.097935 2018-02-14 03:54:00.000 UTC

当我添加“GROUP BY price,timestamp”时,数据没有区别。

我想要不同的时间戳。因此,对于这种情况,结果应该是:

行价格时间戳
1 0.097947 2018-02-14 03:42:00.000 UTC
2 0.09796 2018-02-14 03:43:00.000 UTC
3 0.097959 2018-02-14 03:45:00.000 UTC
4 0.097969 2018-02-14 03:46:00.000 UTC
5 0.097984 2018-02-14 03:47:00.000 UTC
6 0.097899 2018-02-14 03:48:00.000 UTC
7 0.097927 2018-02-14 03:49:00.000 UTC
8 0.097984 2018-02-14 03:50:00.000 UTC
9 0.097995 2018-02-14 03:51:00.000 UTC
10 0.097972 2018-02-14 03:52:00.000 UTC
11 0.097924 2018-02-14 03:53:00.000 UTC
12 0.097935 2018-02-14 03:54:00.000 UTC

【问题讨论】:

    标签: sql database timestamp google-bigquery


    【解决方案1】:

    没有“第一”价格之类的东西,除非另一列指定该值。您可以通过以下方式获得每个时间戳的一个价格:

    SELECT MIN(price), timestamp
    FROM [database]
    WHERE stock = 'appl' AND second(timestamp) = 0
    GROUP BY timestamp;
    

    如果您确实有另一列具有排序,那么您可以使用数组 agg 并选择第一个值。

    【讨论】:

    • 我喜欢 MIN() 聚合。这是我认为效果最好的方法,但是“错误:(L1:26):(L1:38):SELECT 子句混合了聚合 'MinPrice' 和字段 'timestamp' 而没有 GROUP BY 子句”是我尝试的错误获取输出。
    • 实际上你的方法是完美的,加上“GROUP BY timestamp”。你知道是否有一个函数可以获取值的模式而不是最小值或最大值?
    【解决方案2】:

    以下是 BigQuery 标准 SQL(并假设您的 ts 字段是时间戳类型)

    SELECT 
      ARRAY_AGG(price ORDER BY ts LIMIT 1)[SAFE_OFFSET(0)] price,
      TIMESTAMP_TRUNC(ts, MINUTE) ts 
    FROM `yourproject.yourdataset.yourtable`
    WHERE stock = 'appl'
    GROUP BY 2
    ORDER BY 2  
    

    注意:我使用ts 而不是timestamp,因为我不喜欢使用关键字作为列名

    【讨论】:

      【解决方案3】:
      SELECT MIN(price), timestamp
      FROM [database]
      WHERE stock = 'appl' AND second(timestamp) = 0
      GROUP BY timestamp
      ORDER BY timestamp
      

      【讨论】:

        猜你喜欢
        • 2017-03-17
        • 2018-07-05
        • 2019-04-13
        • 1970-01-01
        • 2017-04-30
        • 2020-09-12
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        相关资源
        最近更新 更多