2017-06-28 8 views
0

タイムスタンプの差が60秒未満の連続した行(タイムスタンプ順)をグループ化する際に問題があります。計算に基づいて行をグループ化するにはどうすればよいですか?

ここでは、サンプルテーブルです:

user video  timestamp     time_diff 
---- -------- ----------------------- --------- 
Bob  balldrop 2017-06-01 06:00:00 UTC  null 
Bob  balldrop 2017-06-01 06:00:10 UTC  -10 
Bob  balldrop 2017-06-01 06:00:30 UTC  -20 
Bob  balldrop 2017-06-01 06:00:45 UTC  -15 
Bob  balldrop 2017-06-01 06:04:00 UTC  -195 
Bob  balldrop 2017-06-01 06:04:30 UTC  -30 
Bob  bounce  2017-06-01 06:05:00 UTC  null 
Bob  bounce  2017-06-01 06:05:20 UTC  -20 

望ましい結果:BigQueryの標準SQLのための

user video  timestamp     group 
---- -------- ----------------------- --------- 
Bob  balldrop 2017-06-01 06:00:00 UTC  1 
Bob  balldrop 2017-06-01 06:00:10 UTC  1 
Bob  balldrop 2017-06-01 06:00:30 UTC  1 
Bob  balldrop 2017-06-01 06:00:45 UTC  1 
Bob  balldrop 2017-06-01 06:04:00 UTC  2 
Bob  balldrop 2017-06-01 06:04:30 UTC  2 
Bob  bounce  2017-06-01 06:05:00 UTC  3 
Bob  bounce  2017-06-01 06:05:20 UTC  3 

答えて

2

- 以下でプレイ:

#standardSQL 
WITH data AS (
    SELECT 'Bob' AS user, 'balldrop' AS video, TIMESTAMP '2017-06-01 06:00:00 UTC' AS ts UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:00:10 UTC' UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:00:30 UTC' UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:00:45 UTC' UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:04:00 UTC' UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:04:30 UTC' UNION ALL 
    SELECT 'Bob', 'bounce', TIMESTAMP '2017-06-01 06:05:00 UTC' UNION ALL 
    SELECT 'Bob', 'bounce', TIMESTAMP '2017-06-01 06:05:20 UTC' 
) 
SELECT 
    user, video, ts, 
    SUM(diff) OVER(PARTITION BY user ORDER BY ts) AS group_number 
FROM (
    SELECT 
    user, video, ts, 
    IF(TIMESTAMP_DIFF(ts, LAG(ts) OVER(PARTITION BY user, video ORDER BY ts), SECOND) < 60, 0, 1) AS diff 
    FROM data 
) 
-- ORDER BY ts 

それはどのように明確ではありません異なるユーザーのグループに番号を付けたいので、PARTITION BYは広告にすることができますちょうどそれに依存する

+0

私はあなたが答えたいと思っていた!私はそれがこの単純だったとは信じられません。私はまだ 'diff' <60を持つ行がパーティション内の開始行と同じ' group_number'をどのように取得しているかを理解しようとしています。魔法のようだ!いつものようにありがとう!あなたからとても多くのことを学びます。 – dnaeye

関連する問題