SQL:如何从不规则数据构造一个时间序列,然后在其上计算滚动平均值
我试图计算事故报告中数据的滚动平均值。我要寻找的确切数量是解决mttr的30天平均时间,即过去30天内解决事件所需的平均时间 我的事件表如下所示:SQL:如何从不规则数据构造一个时间序列,然后在其上计算滚动平均值,sql,google-bigquery,Sql,Google Bigquery,我试图计算事故报告中数据的滚动平均值。我要寻找的确切数量是解决mttr的30天平均时间,即过去30天内解决事件所需的平均时间 我的事件表如下所示: | incident_id | start_datetime | end_datetime | |-------------|-----------------------|-----------------------| | 1 | '2020-02-01T10:13:00' | '2020-02
| incident_id | start_datetime | end_datetime |
|-------------|-----------------------|-----------------------|
| 1 | '2020-02-01T10:13:00' | '2020-02-01T10:59:33' |
| 2 | '2020-02-01T17:55:13' | '2020-02-02T00:35:28' |
| 3 | '2020-02-03T13:33:01' | '2020-02-03T15:54:01' |
我想要的是这样的数字是虚构的,所以不要尝试实际计算-只需注意日期时间间隔是每小时:
| datetime | mttr_last30days_in_hours |
|-----------------------|--------------------------|
| '2020-02-01T10:00:00' | 5.7 |
| '2020-02-01T11:00:00' | 5.6 |
| '2020-02-02T12:00:00' | 5.8 |
如果只计算一个时间点,我可以很容易地计算出过去30天的mttr:
选择avgend\u datetime-开始\u datetime mttr\u Last30天\u以小时为单位
从事件中
其中datetime\u diffcurrent\u datetime、start\u datetime、DAY如果您的表中有一个唯一的字段,您可以尝试这样做:
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
我希望这对你有所帮助你需要一个分组条款!实际上,我上面写的SQL语句不需要GROUPBY。你指的是回答我问题的最后一个问题吗?如果是这样,请看一些代码。否则,仅计算单个数字不需要group by。谢谢。时间戳从哪里来?我不确定这是否解决了我的错误。我忘记更改了我测试的查询中的字段。我刚刚更新了答案。你能告诉我这是否是你要找的吗?问题是,如果我们要寻找与开始日期时间值相关的日期,这是很好的。但是,我希望间隔均匀,而不考虑事件的日期时间。例如,如果第一次事件发生在1个月前,那么从上个月到今天的每一个小时我都应该有,无论是否发生了事件。这有意义吗?是的,现在有意义了。我更新了答案。它应该很好用。如果你有什么问题或不明白,请告诉我