2016-11-08 22 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 

我想數着每個URL發生在X天的間隔,從給定日起的每個事件的數量。例如:我如何在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值。

一般來說,我希望能夠解決:從X日開始,從Y日開始,並使用每個間隔的最後日期標記間隔。

如果需要更多說明,請讓我知道。

如果你有興趣,我也問過關於使用滾動窗口對這些數據進行分組的StackOverflow(和已得到的答案)的類似問題:initial questionfollow-up

謝謝!

+0

不是一個完整的答案,但你可以利用['GENERATE_DATE_ARRAY'(HTTPS的://雲.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#generate_date_array)如果您需要加入的日期序列。 –

+0

我接受的答案實際上是使用GENERATE_DATE_ARRAY()和join! –

回答

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

查詢工作,看來,我最初得到了相關的BigQuery停運「tableUnavailable」的錯誤。此外,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()未定義。有一個名爲DATE_DIFF()的函數接受3個參數。不知道這是否可以重做。 –

+0

@TheTravelingCoder。 。 。我正在查看文檔的錯誤版本。 –