【问题标题】:How to group by hour in Google Bigquery如何在 Google Bigquery 中按小时分组
【发布时间】:2019-03-31 15:27:54
【问题描述】:

我的 Google Bigquery 表有日期和时间列。新数据每 10 分钟在表中发布一次,因此日期字段将具有例如“2018-10-26”和时间字段“19:05:00”。对于日期和时间字段,下一条记录类似于“2018-10-26”和“19:15:00”。如何以一小时为单位汇总每天的数据(每天 24 条记录)?

使用 Apps 脚本从 Google 表格发送 SQL 请求。这是 google bigquery.gs 脚本的一部分:(complete script in GitHub)

...
var sheet = SpreadsheetApp.getActiveSheet();

var sql = 'SELECT  date, time, SUM(col1) AS Col1, SUM(col2) AS Col2 GROUP BY 
time, date ORDER BY time ASC';

var queryResults; 

// Inserts a Query Job
try {
var queryRequest = BigQuery.newQueryRequest();
queryRequest.setQuery(sql).setTimeoutMs(100000);
queryResults = BigQuery.Jobs.query(queryRequest, projectNumber);
}
....

【问题讨论】:

    标签: sql google-apps-script google-sheets google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT date, TIME_TRUNC(time, HOUR) hour, SUM(col1) AS Col1, SUM(col2) AS Col2 
    FROM `project.dataset.table`
    GROUP BY date, hour 
    ORDER BY date, hour
    

    您可以在您的问题中使用虚拟数据进行测试,玩弄上述内容:

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT DATE "2018-10-26" date, TIME "19:05:00" time, 1 col1, 2 col2 UNION ALL
      SELECT "2018-10-26", "19:15:00", 3, 4
    ) 
    SELECT date, TIME_TRUNC(time, HOUR) hour, SUM(col1) AS Col1, SUM(col2) AS Col2 
    FROM `project.dataset.table`
    GROUP BY date, hour 
    ORDER BY date, hour  
    

    结果

    Row date        hour        Col1    Col2     
    1   2018-10-26  19:00:00    4       6    
    

    【讨论】:

    • Time_Trunc 函数生成错误:GoogleJsonResponseException:1.25 - 1.36:无法识别函数 time_trunc
    • 您没有包含 #standardSQL 部分,这将启用标准 SQL 作为方言。
    • @Elliott Brossard ,我已将其包含在内,我的应用脚本如下所示: var sql = '#standardSQL SELECT date, TIME_TRUNC(time, HOUR) as hour, SUM(... ,但现在出现错误:GoogleJsonResponseException: 1.1118 - 1.1118: No query found。 我应该以不同的方式包含它吗?
    • 您必须在前缀和查询本身之间添加一个换行符。 cloud.google.com/bigquery/docs/reference/standard-sql/…
    • 好的,现在可以了,谢谢你的提示!我是这样设置的——queryRequest.useLegacySql = false; 现在我的脚本是这样的:// Inserts a Query Job try { var queryRequest = BigQuery.newQueryRequest(); queryRequest.useLegacySql = false; queryRequest.setQuery(sql).setTimeoutMs(100000); queryResults = BigQuery.Jobs.query(queryRequest, projectNumber); }...
    【解决方案2】:

    你可以使用extract():

    SELECT date, extract(hour from time) as hh,
           SUM(col1) AS Col1, SUM(col2) AS Col2
    FROM ?
    GROUP BY date, hh 
    ORDER BY date, hh ASC;
    

    为什么要将日期时间值存储在两个单独的列中,而不是单个 datetimetimestamp 列中?

    【讨论】:

    • extract() 正在生成错误:GoogleJsonResponseException: 1.22 - 1.27: Unrecognized function extract 是的,可以存储在一列中,但它对这个问题有帮助吗?
    • @Intars_K 。 . . extract() 适合我:select extract(hour from cast('10:00:00' as time))
    • 我在 bigquery.gs 脚本中使用这个 SQL 查询,现在它看起来像这样:var sql = 'SELECT date, extract(HOUR FROM time) as hour, SUM(col1...。这正在生成 GoogleJsonResponseException: Encountered " "FROM" "FROM "" at line 1, column 28. Was expected: ")" ... 这种方法可能不适用于使用 Apps 脚本的 Google 表格
    • 您需要启用标准 SQL。
    • @Elliott Brossard,包括这样的:var sql = '#standardSQL SELECT date, extract(hour from cast("10:10:10" as time)), 正在生成错误:GoogleJsonResponseException: 1.1134 - 1.1134: No query found.
    猜你喜欢
    • 2019-08-07
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多