SQL:如何从不规则数据构造一个时间序列,然后在其上计算滚动平均值

SQL:如何从不规则数据构造一个时间序列,然后在其上计算滚动平均值,sql,google-bigquery,Sql,Google Bigquery,我试图计算事故报告中数据的滚动平均值。我要寻找的确切数量是解决mttr的30天平均时间,即过去30天内解决事件所需的平均时间 我的事件表如下所示: | incident_id | start_datetime | end_datetime | |-------------|-----------------------|-----------------------| | 1 | '2020-02-01T10:13:00' | '2020-02

我试图计算事故报告中数据的滚动平均值。我要寻找的确切数量是解决mttr的30天平均时间,即过去30天内解决事件所需的平均时间

我的事件表如下所示:

| 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个月前,那么从上个月到今天的每一个小时我都应该有,无论是否发生了事件。这有意义吗?是的,现在有意义了。我更新了答案。它应该很好用。如果你有什么问题或不明白,请告诉我