2016-09-30 56 views
1

連續週期考慮這個模式的大量查詢表的:組值通過在大量查詢

+---------------------------------------+ 
|ServiceId |UserId |Date    | 
+---------------------------------------+ 
|s1  |u1  |2016|09|01 00:00:00 | 
|s1  |u1  |2016|09|02 00:00:00 | 
|s1  |u2  |2016|09|02 12:00:00 | 
|s1  |u2  |2016|09|05 00:00:00 | 
|s1  |u1  |2016|09|10 12:00:00 | 
|s2  |u1  |2016|09|06 00:00:00 | 
|s2  |u2  |2016|09|10 00:00:00 | 
|s2  |u2  |2016|09|10 12:00:00 | 
|s2  |u2  |2016|09|11 12:00:00 | 
+---------------------------------------+ 

它示出了由所識別的用戶的系統的某些資源的使用。它就像活動日誌一樣工作。

我需要一個查詢,允許我隨着時間的推移檢索資源的連續使用情況。由於該表不包含「開始」和「結束」日期,因此該結尾被認爲是該期間最後一次記錄的日期。

如果兩個日期距離彼此最多24小時,則視爲連續。

這是這樣的查詢的預期輸出與給定的表:

+-------------------------------------------------------------+ 
|ServiceId |UserId |StartDate   |EndDate    | 
+-------------------------------------------------------------+ 
|s1   |u1  |2016|09|01 00:00:00 |2016|09|02 00:00:00 | 
|s1   |u2  |2016|09|02 12:00:00 |2016|09|02 12:00:00 | 
|s1   |u2  |2016|09|05 00:00:00 |2016|09|05 00:00:00 | 
|s1   |u1  |2016|09|10 12:00:00 |2016|09|10 12:00:00 | 
|s2   |u1  |2016|09|06 00:00:00 |2016|09|06 00:00:00 | 
|s2   |u2  |2016|09|10 00:00:00 |2016|09|11 12:00:00 | 
+-------------------------------------------------------------+ 

換句話說:我需要由用戶識別的服務的連續使用時間段。

BigQuery上窗口函數的文檔(herehere)沒有這種用例的清晰示例(事實上,它們沒有日期示例)。

如何使用BigQuery做到這一點?

謝謝。

回答

2

嗯。 。 。我認爲這將是這個樣子:

select serviceid, userid, min(date), max(date) 
from (select t.*, 
      sum(case when dateadd(prev_date, 1, "hour") < date then 1 else 0 end) over (partition by serviceid, userid order by date) as grp 
     from (select t.*, 
        lag(date) over (partition by serviceid, userid order by date) as prev_date 
      from t 
      ) t 
    ) t 
group by serviceid, userid, grp; 

這樣做是找出當有超過1小時的休息時間較大,出現這種情況時1指派的標誌。然後它執行標誌的累計和並將其用於聚合。

+0

我試了一下,它的一些調整工作:'prev_date'應該包含一個'USEC_TO_TIMESTAMP'函數(由於'lag函數和時間戳的bug,更多信息[here](https:// code.google.com/p/google-bigquery/issues/detail?id=204)),並且應該切換比較內的數字('then 1 else 0')。 –

+0

標準SQL沒有這個問題,如果有幫助的話。 https://cloud.google.com/bigquery/sql-reference/ –