Если у вас есть уникальное поле в вашей таблице, вы можете попробовать сделать это:
WITH
t_filter AS(
SELECT
*
FROM
incidents
WHERE datetime_diff(current_datetime(), start_datetime, DAY) <= 30
),
t_dates AS (
SELECT
unique_key,
GENERATE_DATE_ARRAY(DATE(start_datetime), CURRENT_DATE(), INTERVAL 1 DAY) AS date_array
FROM
t_filter
),
t_hour AS (
SELECT *
FROM
UNNEST(["00:00:00",
"01:00:00",
"02:00:00",
"03:00:00",
"04:00:00",
"05:00:00",
"06:00:00",
"07:00:00",
"08:00:00",
"09:00:00",
"10:00:00",
"11:00:00",
"12:00:00",
"13:00:00",
"14:00:00",
"15:00:00",
"16:00:00",
"17:00:00",
"18:00:00",
"19:00:00",
"20:00:00",
"21:00:00",
"22:00:00",
"23:00:00"]) h
),
sequence AS(
SELECT
unique_key,
CONCAT(CAST(arr AS string),"T", h) date_hour
FROM
t_dates,
UNNEST(date_array) arr,
t_hour
)
SELECT
date_hour,
AVG(end_datetime - start_datetime)
FROM
sequence
LEFT JOIN
t_filter
ON
incidents.unique_key = sequence.unique_key
GROUP BY
date_hour
Надеюсь, это поможет