Ниже для BigQuery Standard SQL
#standardSQL
SELECT *,
CASE value > 10 AND prev_value < 10
WHEN TRUE THEN
MAX(value) OVER(ORDER BY UNIX_SECONDS(ts) RANGE BETWEEN CURRENT ROW AND 1800 FOLLOWING)
ELSE NULL
END max_value_next_30_min
FROM (
SELECT *, LAG(value) OVER(ORDER BY ts) prev_value
FROM `project.dataset.table`
)
-- ORDER BY ts
Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT TIMESTAMP '2019-07-11 02:20:00 UTC' ts, 14.99 value UNION ALL
SELECT '2019-07-11 02:30:00 UTC', 12.53 UNION ALL
SELECT '2019-07-11 02:40:00 UTC', 12.53 UNION ALL
SELECT '2019-07-11 02:50:00 UTC', 14.99 UNION ALL
SELECT '2019-07-11 03:00:00 UTC', 10.07 UNION ALL
SELECT '2019-07-11 03:10:00 UTC', 7.61 UNION ALL
SELECT '2019-07-11 03:20:00 UTC', 7.61 UNION ALL
SELECT '2019-07-11 03:30:00 UTC', 10.07 UNION ALL
SELECT '2019-07-11 03:40:00 UTC', 10.07 UNION ALL
SELECT '2019-07-11 03:50:00 UTC', 17.61 UNION ALL
SELECT '2019-07-11 04:00:00 UTC', 7.61 UNION ALL
SELECT '2019-07-11 04:10:00 UTC', 7.61
)
SELECT *,
CASE value > 10 AND prev_value < 10
WHEN TRUE THEN
MAX(value) OVER(ORDER BY UNIX_SECONDS(ts) RANGE BETWEEN CURRENT ROW AND 1800 FOLLOWING)
ELSE NULL
END max_value_next_30_min
FROM (
SELECT *, LAG(value) OVER(ORDER BY ts) prev_value
FROM `project.dataset.table`
)
-- ORDER BY ts
с выводом
Row ts value prev_value max_value_next_30_min
1 2019-07-11 02:20:00 UTC 14.99 null null
2 2019-07-11 02:30:00 UTC 12.53 14.99 null
3 2019-07-11 02:40:00 UTC 12.53 12.53 null
4 2019-07-11 02:50:00 UTC 14.99 12.53 null
5 2019-07-11 03:00:00 UTC 10.07 14.99 null
6 2019-07-11 03:10:00 UTC 7.61 10.07 null
7 2019-07-11 03:20:00 UTC 7.61 7.61 null
8 2019-07-11 03:30:00 UTC 10.07 7.61 17.61
9 2019-07-11 03:40:00 UTC 10.07 10.07 null
10 2019-07-11 03:50:00 UTC 17.61 10.07 null
11 2019-07-11 04:00:00 UTC 7.61 17.61 null
12 2019-07-11 04:10:00 UTC 7.61 7.61 null