【问题标题】:How to calculate an average of TIMESTAMP column如何计算 TIMESTAMP 列的平均值
【发布时间】:2020-11-17 06:42:45
【问题描述】:

我有一个名为时间戳的列

我想知道所有条目的平均时间戳

这是因为我需要知道用户在什么时间在我的应用中执行某些操作

每个时间戳条目的格式都是这个

2020-07-13 00:01:12.616 UTC

我不能只使用

SELECT AVG(timestamp) from my_table 

因为 AVG 只适用于某些类型

如何计算平均时间?

【问题讨论】:

标签: sql google-bigquery timestamp


【解决方案1】:

您可以转换为秒(或毫秒或微秒)并返回时间戳:

select timestamp_seconds(cast(avg(unix_seconds(timestamp)) as int64))
from my_table

【讨论】:

  • 得到以下参数类型的函数 TIMESTAMP_SECONDS 没有匹配的签名:FLOAT64。支持的签名:TIMESTAMP_SECONDS(INT64) at [1:8]
【解决方案2】:

以下是 BigQuery 标准 SQL

我假设您想知道用户活动的平均时间或类似的东西 - 根据您的声明 I need to know in which time is where the user do some actions in my app

#standardSQL
SELECT TIMESTAMP_ADD(ts, INTERVAL avg_value MILLISECOND) 
FROM (
  SELECT TIMESTAMP_TRUNC(ts, DAY) ts, CAST(AVG(TIMESTAMP_DIFF(ts, TIMESTAMP_TRUNC(ts, DAY), MILLISECOND)) AS INT64) avg_value
  FROM `project.dataset.table`
  GROUP BY TIMESTAMP_TRUNC(ts, DAY)
)   

您可以使用虚拟数据进行测试,如以下示例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT TIMESTAMP '2020-07-13 00:01:12.616 UTC' ts UNION ALL
  SELECT '2020-07-13 00:01:14.616 UTC' UNION ALL
  SELECT '2020-07-13 00:01:15.616 UTC' 
)
SELECT TIMESTAMP_ADD(ts, INTERVAL avg_value MILLISECOND) 
FROM (
  SELECT TIMESTAMP_TRUNC(ts, DAY) ts, CAST(AVG(TIMESTAMP_DIFF(ts, TIMESTAMP_TRUNC(ts, DAY), MILLISECOND)) AS INT64) avg_value
  FROM `project.dataset.table`
  GROUP BY TIMESTAMP_TRUNC(ts, DAY)
)   

有输出

Row f0_  
1   2020-07-13 00:01:14.283 UTC  

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2019-02-07
    相关资源
    最近更新 更多