在数据不一致的PostgreSQL中获取时间范围内的移动平均值

在数据不一致的PostgreSQL中获取时间范围内的移动平均值,sql,postgresql,window-functions,moving-average,Sql,Postgresql,Window Functions,Moving Average,我有一个名为answers的表,其中包含在和response中创建的列,response为整数0表示“否”,1表示“是”,2表示“不知道”。我想得到响应值的移动平均值,过滤掉每天2个,只考虑前30天。我知道您可以在29行和前一行之间以及当前行之间创建行,但只有在每天都有数据的情况下,这才有效,在我的情况下,可能一周或更长时间内都没有数据 我目前的问题是: SELECT answers.created_at, answers.response, AVG(answers.response)

我有一个名为answers的表,其中包含在和response中创建的列,response为整数0表示“否”,1表示“是”,2表示“不知道”。我想得到响应值的移动平均值,过滤掉每天2个,只考虑前30天。我知道您可以在29行和前一行之间以及当前行之间创建行,但只有在每天都有数据的情况下,这才有效,在我的情况下,可能一周或更长时间内都没有数据

我目前的问题是:

SELECT answers.created_at, answers.response,
    AVG(answers.response)
      OVER(ORDER BY answers.created_at::date ROWS 
        BETWEEN 29 PRECEDING AND CURRENT ROW) AS rolling_average
  FROM answers
  WHERE answers.user_id = 'insert_user_id'' 
    AND (answers.response = 0 OR answers.response = 1)
  GROUP BY answers.created_at, answers.response
  ORDER BY answers.created_at::date

但这将返回基于前几行的平均值,如果用户在2018-3-30回答1,在2018-5-15回答0,2018-5-15的滚动平均值将是0.5,而不是我想要的0。如何创建一个只考虑过去30天内为滚动平均值创建的响应的查询?

尝试以下操作:

从中选择* 选择 d、 创建于,d.response, Avgd.response OVERORDER BY d.created_at::日期前29行和当前行之间的行作为滚动_平均值 从…起 选择 Coalesca.created_at,d.创建日期_at,响应,a.user_id 从…起 选择生成_系列“2018-01-01”::日期,“2018-05-31”::日期,“1天”::间隔::日期作为日期d 左连接 从answers.user\u id='insert\u user\u id'和answers.response=0或answers.response=1 a的答案中选择* 在d.dates=a.created_在::日期 D 由d.创建的分组,d.响应 agg其中agg.response不为NULL 按集合创建的订单日期::日期

generate_系列创建天数列表-您必须设置合理的边界 此天数列表与预选答案一起保留 该结果用于滚动平均值计算 之后,我仅选择带有响应的记录,并获得: 创建于|响应|滚动|平均值 2018-03-30 | 1 | 1.00000000000000000000 2018-05-15 | 0 | 0.00000000000000000000

从Postgres 11开始,您可以这样做:

SELECT created_at, 
       response,
       AVG(response) OVER (ORDER BY created_at 
                           RANGE BETWEEN '29 day' PRECEDING AND current row) AS rolling_average 
FROM answers
WHERE user_id = 1
  AND response in (0,1)
ORDER BY created_at;

在sqlfiddle.com上提供示例数据,并根据示例数据添加预期结果。能否提供一些示例数据和预期结果?我知道您可以在29行和前一行之间以及当前行之间创建行,但只有在每天都有数据的情况下,这才有效,在我的情况下,可能一周或更长时间内都没有数据。PostgreSQL 8.0+支持generate_系列函数为其生成日历表。