はそれがより実用的な出力を返す私の視点から、バージョン
の下に考えてみて、同じレベルの連続した活動の全ての期間(それぞれの開始と終了を)
だからあなたは今だけ起動しません最も高いアクティビティを持つ期間全体(開始日と終了日)。そして1つだけでなく、それらのすべて
は
#standardSQL
WITH intervals AS (
SELECT time AS start_, LEAD(time) OVER(ORDER BY time) AS end_
FROM (
SELECT DISTINCT time FROM (
SELECT starttime AS time FROM activities UNION ALL
SELECT stoptime AS time FROM activities))
),
equals AS (
SELECT start_, end_, COUNT(1) AS cumsum
FROM intervals AS i
JOIN activities AS a
ON i.start_ >= a.starttime AND i.end_ <= a.stoptime
GROUP BY start_, end_
),
grps AS (
SELECT
start_, end_, cumsum,
IFNULL(
CAST(end_ = LEAD(start_) OVER(ORDER BY start_) AND LEAD(cumsum) OVER(ORDER BY start_) = cumsum AS INT64),
CAST(NOT((start_ = LAG(end_) OVER(ORDER BY start_) AND LAG(cumsum) OVER(ORDER BY start_) = cumsum)) AS INT64)
) AS flag
FROM equals
)
SELECT MIN(start_) AS start_, MAX(end_) AS end_, cumsum
FROM (
SELECT start_, end_, cumsum, SUM(flag) OVER(ORDER BY start_) AS grp
FROM grps
)
GROUP BY cumsum, grp
ORDER BY start_
あなたはダミー活動にテーブルを使用して、上記で遊ぶことができます
WITH activities AS (
SELECT 1 AS starttime, 3 AS stoptime UNION ALL
SELECT 1 AS starttime, 4 AS stoptime UNION ALL
SELECT 4 AS starttime, 5 AS stoptime UNION ALL
SELECT 7 AS starttime, 8 AS stoptime UNION ALL
SELECT 7 AS starttime, 10 AS stoptime UNION ALL
SELECT 8 AS starttime, 12 AS stoptime
)
または
WITH activities AS (
SELECT TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 MINUTE) AS starttime, TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 3 MINUTE) AS stoptime UNION ALL
SELECT TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 MINUTE) AS starttime, TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 4 MINUTE) AS stoptime UNION ALL
SELECT TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 4 MINUTE) AS starttime, TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 5 MINUTE) AS stoptime UNION ALL
SELECT TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 MINUTE) AS starttime, TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 8 MINUTE) AS stoptime UNION ALL
SELECT TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 MINUTE) AS starttime, TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 10 MINUTE) AS stoptime UNION ALL
SELECT TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 8 MINUTE) AS starttime, TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 12 MINUTE) AS stoptime
)
何あなたの瞬間の細かさがある - それは秒であります、分または時間か他の何か? –
@MikhailBerlyant私はそれがミリ秒だと思います。 –
なので、ほとんどのアクティビティを取得した全体の期間中に正確にミリ秒で検出する必要がありますか?これは大部分のユースケースでは実用的ではないと思われますが、特殊なケースがあるかもしれません。 –