web-dev-qa-db-ja.com

GoogleBigqueryで時間ごとにグループ化する方法

私のGoogleBigqueryテーブルには日付と時刻の列があります。新しいデータは10分ごとにテーブルに投稿されるため、日付フィールドには次のようになります。 「2018-10-26」とタイムフィールド「19:05:00」。次のレコードは、日付と時刻のフィールドで「2018-10-26」と「19:15:00」のようになります。毎日のデータを1時間(1日あたり24レコード)で集計するにはどうすればよいですか?

SQLリクエストは、AppsScriptを使用してGoogleスプレッドシートから送信されます。これがgooglebigquery.gsスクリプトの一部です:( 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);
}
....
4
Intars_K

以下は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    
5

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;

日時値を単一のdatetimeまたはtimestamp列ではなく、2つの別々の列に格納するのはなぜですか?

2
Gordon Linoff