从 bigQuery 中的时间戳聚合变量

Posted

技术标签:

【中文标题】从 bigQuery 中的时间戳聚合变量【英文标题】:Aggregrate the variable from timestamp on bigQuery 【发布时间】:2020-06-11 04:11:22 【问题描述】:

我计划为每个用户计算最频繁的 part_of_day。在这种情况下,首先,我用 part_of_day 编码时间戳,然后用频率最高的 part_of_day 聚合。我使用 ARRAY_AGG 来计算模式 ()。但是,我不确定如何用 ARRAY_AGG 处理时间戳,因为有错误,所以我的代码结构可能是错误的

SELECT  User_ID, time,
ARRAY_AGG(Time ORDER BY cnt DESC LIMIT 1)[OFFSET(0)] part_of_day,

case
  when  time BETWEEN '04:00:00' AND '12:00:00' 
  then  "morning"
  when  time < '04:00:00' OR time > '20:00:00' 
  then  "night" 
end AS part_of_day 

FROM (
      SELECT User_ID, 
        TIME_TRUNC(TIME(Request_Timestamp), SECOND) AS Time
        COUNT(*) AS cnt
    

收到错误:

Syntax error: Expected ")" but got identifier "COUNT" at [19:9]

【问题讨论】:

【参考方案1】:

即使您没有分享任何示例数据,我还是能够在您的代码中发现一些问题。

我使用了一些基于您在代码中使用的格式和函数创建的示例数据,以保持一致性。以下是代码,没有任何错误:

WITH data AS (
SELECT 98 as User_ID,DATETIME "2008-12-25 05:30:00.000000" AS Request_Timestamp, "something!" AS channel UNION ALL
SELECT 99 as User_ID,DATETIME "2008-12-25 22:30:00.000000" AS Request_Timestamp, "something!" AS channel
)
SELECT  User_ID, time,
ARRAY_AGG(Time ORDER BY cnt DESC LIMIT 1)[OFFSET(0)] part_of_day1,

case
  when  time BETWEEN '04:00:00' AND '12:00:00' 
  then  "morning"
  when  time < '04:00:00' OR time > '20:00:00' 
  then  "night" 
end AS part_of_day 

FROM (
      SELECT User_ID,
        TIME_TRUNC(TIME(Request_Timestamp), SECOND) AS time,
        COUNT(*) AS cnt
      FROM data
   GROUP BY User_ID, Channel, Request_Timestamp
   #order by Request_Timestamp

    )
    GROUP BY User_ID, Time;

首先,请注意我在您的ARRAY_AGG() 方法中更改了列名,必须这样做,因为这会导致错误“列名重复”。其次,在您的TIME_TRUNC() 函数之后,它缺少一个逗号,因此您可以选择COUNT(*)。然后,在您的GROUP BY 中,您还需要对Request_Timestamp 进行分组,因为它既没有聚合也没有分组。最后,在上一个 GROUP BY 中,您需要聚合或分组 time。因此,在这些更正之后,您的代码将毫无错误地执行。

注意:您遇到的Syntax error: Expected ")" but got identifier "COUNT" at [19:9] 错误是由于缺少逗号所致。其他的会在更正后显示。

【讨论】:

你能在 UNION 线上解释更多吗? (选择 98 作为用户 ID,日期时间“2008-12-25 05:30:00.000000”)。您指定要查询的时间戳吗? WITH 语句中的所有内容都是我的示例数据(我称之为数据),我只是加入了我创建的两行数据,这就是我使用 UNION ALL 的原因。请注意,我在 FROM 语句中使用了data,因为它是在 WITH 中定义的。因此,在您的代码中,您不需要使用我的代码的示例数据部分。请考虑投票并接受答案。【参考方案2】:

如果你想要每天最频繁的部分,你需要在聚合中使用day部分:

SELECT User_ID,
       ARRAY_AGG(part_of_day ORDER BY cnt DESC LIMIT 1)[OFFSET(0)] part_of_day
FROM (SELECT User_ID, 
             (case when time BETWEEN '04:00:00' AND '12:00:00' then 'morning'
                   when time < '04:00:00' OR time > '20:00:00' then 'night'
              end) AS part_of_day 
             COUNT(*) AS cnt
      FROM cognitivebot2.chitchaxETL.conversations 
      GROUP BY User_ID, part_of_day
     ) u
GROUP BY User_ID;

显然,如果您也想要频道,那么您需要将其包含在查询中。

【讨论】:

以上是关于从 bigQuery 中的时间戳聚合变量的主要内容,如果未能解决你的问题,请参考以下文章

无法从 BigQuery 中的时间戳中提取日期

努力从 BigQuery SQL 中的时间戳字段中提取特定月份的 DATE

从 BigQuery 中的时间戳数据类型中获取每月前 3 个标签数量

Bigquery:如何将 2 个时间戳列合并为 1 个列?

从时间戳中提取的 Bigquery 失败

在时间戳字段中插入日期时间变量