Sql 根据bigQuery上的时间戳对变量进行聚合

Sql 根据bigQuery上的时间戳对变量进行聚合,sql,google-bigquery,Sql,Google Bigquery,我计划为每个用户计算一天中最频繁的部分。在这种情况下,首先,我用天中的部分对时间戳进行编码,然后用天中频率最高的部分进行聚合。我使用数组_AGG来计算模式。但是,我不确定如何使用数组_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'

我计划为每个用户计算一天中最频繁的部分。在这种情况下,首先,我用天中的部分对时间戳进行编码,然后用天中频率最高的部分进行聚合。我使用数组_AGG来计算模式。但是,我不确定如何使用数组_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
    

即使您没有共享任何示例数据,我也能够识别代码中的一些问题

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

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\u TRUNC函数之后,它缺少一个逗号,因此您可以选择COUNT*。然后,在GroupBy中,您还需要对请求时间戳进行分组,因为它既没有聚合也没有分组。最后,在上一个分组中,您需要聚合或分组时间。因此,在这些更正之后,您的代码将在没有任何错误的情况下执行


注意:语法错误:预期但在[19:9]处获得标识符计数。您遇到的错误是由于缺少逗号。其他部分将在更正此部分后显示。

如果您希望获得每天最频繁的部分,则需要在聚合中使用日部分:

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;

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

您能在联合线上解释更多吗。选择98作为用户ID,日期时间2008-12-25 05:30:00.000000。您指定要查询的时间戳了吗?WITH语句中的所有内容都是我的示例数据,我称之为data,我刚刚连接了我创建的两行数据,这就是我使用UNION ALL的原因。请注意,我在FROM语句中使用了数据,因为它是在WITH中定义的。因此,在您的代码中,您不需要使用我的代码的示例数据部分。请考虑投票并接受答案。
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;