2016-11-08 17 views
2

私は、グループ化の問題に取り組んでいるBigQueryとSQL初心者です。 BigQueryで標準SQLを使用すると、データをX日ごとにグループ化したいと思います。ここでは、データのテーブルです:BigQueryと標準SQL:任意の日間隔でグループ化する方法

event_id | url |   timestamp 
----------------------------------------------------------- 
    xx   a.html  2016-10-18 15:55:16 UTC 
    xx   a.html  2016-10-19 16:68:55 UTC 
    xx   a.html  2016-10-25 20:55:57 UTC 
    yy   b.html  2016-10-18 15:58:09 UTC 
    yy   b.html  2016-10-18 08:32:43 UTC 
    zz   a.html  2016-10-20 04:44:22 UTC 
    zz   c.html  2016-10-21 02:12:34 UTC 

私は与えられた日から、X日の間隔で各URLに発生した各イベントの数をカウントします。例:3日間隔でグループ化するにはどうすればよいですか?最初の間隔は2016-10-18 00:00:00 UTCから始まります。さらに、間隔の3日目を各行に割り当てることはできますか?出力例:

event_id | url | count |  3dayIntervalLabel 
----------------------------------------------------------- 
    xx   a.html  2   2016-10-20 --> [18th thru 20th] 
    yy   b.html  2   2016-10-20 
    zz   a.html  1   2016-10-20 
    zz   c.html  1   2016-10-23 --> [21th thru 23th] 
    xx   a.html  1   2016-10-26 --> [24th thru 26th] 

3dayIntervalLabelの値を明確にするために3つの注釈を追加しました。

一般的には、Y日からX日の間隔でグループ化し、各間隔の最終日を使用して間隔にラベルを付けることを考えています。

もっと詳しい説明が必要な場合は教えてください。

ローリングウィンドウ(initial questionfollow-up)を使用して、このデータをグループ化することについてStackOverflow(および取得した回答)についても同様の質問をしました。

ありがとうございます!

+0

ない完全な答えが、あなたは[ 'GENERATE_DATE_ARRAY'](HTTPSを利用することができるかもしれ://クラウド.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#generate_date_array)。 –

+0

私が受け入れた答えは実際にGENERATE_DATE_ARRAY()と結合を利用しています! –

答えて

3
WITH dailyAggregations AS (
    SELECT 
    DATE(ts) AS day, 
    url, 
    event_id, 
    UNIX_SECONDS(TIMESTAMP(DATE(ts))) AS sec, 
    COUNT(1) AS events 
    FROM yourTable 
    GROUP BY day, url, event_id, sec 
), 
calendar AS (
    SELECT day, DATE_ADD(day, INTERVAL 2 DAY) AS endday 
    FROM UNNEST (GENERATE_DATE_ARRAY('2016-10-18', '2016-11-06', INTERVAL 3 DAY)) AS day 
) 
SELECT 
    event_id, 
    url, 
    SUM(events) AS `count`, 
    c.endday AS `ThreedayIntervalLabel` 
FROM calendar AS c 
JOIN dailyAggregations AS a 
ON a.day BETWEEN c.day AND c.endday 
GROUP BY endday, url, event_id 
+0

これはうまく見えますが、私は最後にそれをテストするのに問題があります。私はそれがクエリに無関係だと思う。私は20回以上クエリを実行しようとしましたが、これは一度だけ完了しました。それ以外の場合は、「tableUnavailable」エラーが発生しました。これを理解したら、クエリが機能することを確認します。 –

+0

BigQuery側で何かが起こっています。人々の数は同じエラーを参照してください! https://status.cloud.google.com/を参照してください - 赤で表示されています –

+0

クエリが機能し、当初取得していた「tableUnavailable」エラーがBigQueryの停止に関連していたようです。また、dailyAggregationsクエリの "UNIX_SECONDS(TIMESTAMP(DATE(ts)))AS sec"という行は、この場合には必要ないし、使用されません。 –

0

あなたはこのような場合、何か基準日がある場合:

select floor(date_diff(date(timestamp), date '2016-10-18', day)/3) as days, 
     count(*) 
from t 
group by days 
order by days; 
+0

BIgQueryの標準SQL言語を使用すると、datediff()は定義されていません。 3つのパラメータを受け入れるDATE_DIFF()という関数があります。これが再加工できるかどうかはわかりません。 –

+0

@TheTravelingCoder。 。 。私は間違ったバージョンのドキュメントを見ていました。 –

関連する問題