Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在按小时分组的情况下获得三小时滚动平均值?_Mysql_Sql - Fatal编程技术网

Mysql 如何在按小时分组的情况下获得三小时滚动平均值?

Mysql 如何在按小时分组的情况下获得三小时滚动平均值?,mysql,sql,Mysql,Sql,我有一桌电话。它有以下列:开始时间、类型、持续时间 我有一个查询,可以获取每小时的平均通话持续时间: SELECT CONCAT(FROM_UNIXTIME(UNIX_TIMESTAMP(t1.start_time), '%Y-%m-%d %H'), ':00') as h, t1.type, AVG(t1.duration) FROM phone_calls t1 WHERE t1.start_time > '2015-09-02 00:00'

我有一桌电话。它有以下列:开始时间、类型、持续时间

我有一个查询,可以获取每小时的平均通话持续时间:

SELECT
    CONCAT(FROM_UNIXTIME(UNIX_TIMESTAMP(t1.start_time), '%Y-%m-%d %H'), ':00') as h,
    t1.type,
    AVG(t1.duration)
FROM
    phone_calls t1

WHERE
    t1.start_time > '2015-09-02 00:00'
    AND t1.duration is not null
GROUP BY
    t1.type,
    h
ORDER BY
    h asc
我不想得到每小时的平均值,而是想得到每小时过去三个小时的平均值

我尝试了这个,但没有成功:

SELECT
    h,
    type,
    (

        SELECT
            dur_sum * dur_count / SUM(dur_count) rolling_avg
        FROM(
            SELECT
                CONCAT(FROM_UNIXTIME(UNIX_TIMESTAMP(t1.start_time), '%Y-%m-%d %H'), ':00') as h,
                t1.type,
                SUM(t1.duration),
                COUNT(t1.duration)
            FROM
                phone_calls t1

            WHERE
                t1.start_time > '2015-09-02 00:00'
                AND t1.duration is not null
            GROUP BY
                t1.type,
                h
            ORDER BY
                h asc
        ) as q1
        WHERE
            h BETWEEN DATE_SUB(h, INTERVAL 3 HOUR) AND h
    ) as rolling
FROM(
    SELECT
        CONCAT(FROM_UNIXTIME(UNIX_TIMESTAMP(t1.start_time), '%Y-%m-%d %H'), ':00') as h,
        t1.type,
        SUM(t1.duration),
        COUNT(t1.duration)
    FROM
        phone_calls t1

    WHERE
        t1.start_time > '2015-09-02 00:00'
        AND t1.duration is not null
    GROUP BY
        t1.type,
        h
    ORDER BY
        h asc
) as q2
该查询为所有行的滚动列提供了相同的值。如何更改查询以获得所需内容?谢谢

编辑:

以下是我的第一个查询返回的结果:

h                 , type ,t_avg    
"2015-09-02 00:00", 2    ,773.5000    
"2015-09-02 00:00", 3    ,246.7966  
"2015-09-02 00:00", 1    ,377.4337  
"2015-09-02 01:00", 1    ,258.7692  
"2015-09-02 01:00", 3    ,188.9737  
"2015-09-02 02:00", 3    ,144.6471  
"2015-09-02 02:00", 1    ,254.4400  
"2015-09-02 03:00", 1    ,67.9048  
"2015-09-02 03:00", 3    ,88.9333  

以下是表格本身的一些示例数据:

start_time            ,type ,duration  
"2015-09-02 00:00:11" ,3    ,174  
"2015-09-02 00:00:15" ,1    ,1088  
"2015-09-02 00:00:27" ,1    ,23  
"2015-09-02 00:00:43" ,3    ,125  
"2015-09-02 00:00:52" ,1    ,31  
"2015-09-02 00:01:05" ,3    ,21  
"2015-09-02 00:01:16" ,1    ,43  
"2015-09-02 00:01:40" ,1    ,88  
"2015-09-02 00:02:17" ,1    ,117  
"2015-09-02 00:04:06" ,1    ,22  
"2015-09-02 00:04:13" ,1    ,46  
"2015-09-02 00:04:15" ,1    ,116  
"2015-09-02 00:04:29" ,3    ,57  
"2015-09-02 00:04:44" ,3    ,728  
"2015-09-02 00:04:57" ,3    ,132   
这就是我从数据中想要的:

h                 , type ,rolling_avg    
"2015-09-02 00:00", 2    ,<average duration for past three hours for type 2>     
"2015-09-02 00:00", 3    ,<average duration for past three hours for type 3>  
"2015-09-02 00:00", 1    ,<average duration for past three hours for type 1>  
"2015-09-02 01:00", 1    ,<average duration for past three hours for type 1>  
"2015-09-02 01:00", 3    ,<average duration for past three hours for type 3>  
"2015-09-02 02:00", 3    ,<average duration for past three hours for type 3>  
"2015-09-02 02:00", 1    ,<average duration for past three hours for type 1>  
"2015-09-02 03:00", 1    ,<average duration for past three hours for type 1>  
"2015-09-02 03:00", 3    ,<average duration for past three hours for type 3>  
h,类型,滚动平均值
"2015-09-02 00:00", 2    ,     
"2015-09-02 00:00", 3    ,  
"2015-09-02 00:00", 1    ,  
"2015-09-02 01:00", 1    ,  
"2015-09-02 01:00", 3    ,  
"2015-09-02 02:00", 3    ,  
"2015-09-02 02:00", 1    ,  
"2015-09-02 03:00", 1    ,  
"2015-09-02 03:00", 3    ,  

我会给你一个简单的方法。因为我没有这个模式

如果已经有小时平均值,只需添加
count
字段

SELECT
    CONCAT(FROM_UNIXTIME(UNIX_TIMESTAMP(t1.start_time), '%Y-%m-%d %H'), ':00') as h,
    t1.type,
    AVG(t1.duration) t_avg,
    COUNT(t1.duration) t_count
添加一个限制和订单

ORDER BY h
LIMIT 3
然后,在这个问题上

SELECT SUM( t_avg * t_count ) / SUM( t_count )
FROM <previous query>
选择总和(t_平均*t_计数)/总和(t_计数)
从…起

只需将您的表格与

Union all
第一个是:

(select CONCAT(FROM_UNIXTIME(UNIX_TIMESTAMP(t1.start_time), '%Y-%m-%d %H'), ':00') as h,
    t1.type,duration from phone_calls t1)
第二个是间隔时间为1小时的日期 第三个是日期加间隔-2小时


然后运行一个外部查询:
从q1组中按h选择h,键入,平均(持续时间),键入

一些示例数据将非常有用。请阅读您的意思是过去3小时的单一平均值,还是h1、h2、h3的平均值为3?此外,如果呼叫从h1开始并持续超过60分钟,则平均值仅影响h1或将影响h2?@JuanCarlosOropeza我的意思是h1、h2、h3的平均值为3。它只会影响h1。调用只应在启动时计算。@JuanCarlosOropeza感谢您使数据更易于读取。我不知道怎么做桌子。没问题。。。需要在行前添加4个空格。谢谢您的帮助!这只是我过去三个小时的平均值。我想要过去X小时数中每小时平均三小时的时间。我将在原始问题中添加一些示例数据。不过,我在帖子的表格中有一个列的列表。是的,你必须解释每小时三小时的平均值是什么意思。这意味着
avg(h1,h2,h3)
+
avg(h2,h3,h4)
+
avg(h3,h4,h5)
。。。等等?我必须说,如果你读了你的问题,说
我想得到过去三个小时的平均值。
这意味着三个小时的滚动平均值。我编辑了这个问题,试图让它更清楚一点。对不起,我不熟悉术语
滚动平均值
,如果你能证明你的预期结果会很好。同样,在您的第一个查询中,我认为您的意思是
按t1分组。键入
我不确定您的意思:“第二个日期加间隔-1小时,第三个日期加间隔-2小时”,您将每天的行分别设置为1小时和2小时