考虑下面的版本
从我的角度来看,它返回更实际的输出 - 这是 - 同一级别的连续活动的各个阶段(对应开头和结尾)
所以你现在不只是开始但是具有最高活动的整个时期(开始和结束)。不只是一个,但他们都
#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我认为这是毫秒。 –
因此,您需要在整个时间段内找到您最精确的毫秒数?请确认,因为这听起来并不适用于大多数使用情况的实际,但你可能有一些特殊的情况下 –