Mysql 在我的子查询中,从当前行的时间戳字段和下一行的同一字段中检索timediff

Mysql 在我的子查询中,从当前行的时间戳字段和下一行的同一字段中检索timediff,mysql,sql,select,Mysql,Sql,Select,我想从子查询中当前行的timestamp字段和下一行的同一字段中检索timediff。但仅当用户相同且时间差大于10分钟时,返回值按天分组。为什么返回的值远高于60小时,这是不正确的,因为一天只有24小时。我错过了什么 请帮助: select DATE_FORMAT( last_call, '%d' ) AS 'day', COUNT(call_id) as id, SEC_TO_TIME(SUM((select timestampdiff(second, calls.last_

我想从子查询中当前行的timestamp字段和下一行的同一字段中检索timediff。但仅当用户相同且时间差大于10分钟时,返回值按天分组。为什么返回的值远高于60小时,这是不正确的,因为一天只有24小时。我错过了什么

请帮助:

select DATE_FORMAT( last_call, '%d' ) AS 'day',
    COUNT(call_id) as id,

   SEC_TO_TIME(SUM((select timestampdiff(second, calls.last_call, c2.last_call)
    from calls c2
    where c2.calling_agent = calls.calling_agent and
          c2.last_call > calls.last_call and
          timestampdiff(second, calls.last_call, c2.last_call) > 600 and
          c2.last_call
    order by c2.last_call
    limit 1
   ))) brakes from calls WHERE calling_agent =9  AND 
last_call > DATE_SUB( now( ) , INTERVAL 12 MONTH ) 
GROUP BY EXTRACT( DAY FROM last_call )

问题出在计算时间差的嵌套查询中

让我们创建一个示例表来解释:

create table calls (call_id int, calling_agent int, last_call datetime);
insert into calls VALUES (1, 9, "2015-01-26 14:00:00");
insert into calls VALUES (2, 9, "2015-01-26 14:05:00");
insert into calls VALUES(3, 9, "2015-01-26 14:12:00");
select * from calls;

| CALL_ID | CALLING_AGENT |                      LAST_CALL |
|---------|---------------|--------------------------------|
|       1 |             9 | January, 26 2015 14:00:00+0000 |
|       2 |             9 | January, 26 2015 14:05:00+0000 |
|       3 |             9 | January, 26 2015 14:12:00+0000 |
如果你看到数据,两次休息都不到10分钟(5分钟和7分钟)。所以总和应该是0。但是您的查询将连接第1行和第3行,并将中断时间计算为12

select DATE_FORMAT( last_call, '%d' ) AS 'day',
    COUNT(call_id) as id,

   SEC_TO_TIME(SUM((select timestampdiff(second, calls.last_call, c2.last_call)
    from calls c2
    where c2.calling_agent = calls.calling_agent and
          c2.last_call > calls.last_call and
          timestampdiff(second, calls.last_call, c2.last_call) > 600 and
          c2.last_call
    order by c2.last_call
    limit 1
   ))) brakes from calls WHERE calling_agent =9  AND 
last_call > DATE_SUB( now( ) , INTERVAL 12 MONTH ) 
GROUP BY EXTRACT( DAY FROM last_call );

| DAY | ID |    BRAKES |
|-----|----|-----------|
|  26 |  3 |  00:12:00 |
你可以玩这个

由于该错误,所有中断的总和也可能超过24小时。我创造了一个例子

为了实际解决这个问题,我建议创建一个带有列组的临时表,如前所述

然后可以使用此查询

CREATE TEMPORARY TABLE c2 SELECT * FROM c1; -- create copy because sqlize doesn't allow joins with the same table.

SELECT
    DATE_FORMAT( t.last_call, '%d' ) AS 'day',
    COUNT(t.call_id) as id,
    SEC_TO_TIME(SUM(t.BreakTimeInSeconds)) AS TotalBreakTime
FROM
(
    SELECT
        c1.call_id, c1.calling_agent, c1.last_call, TIMESTAMPDIFF(SECOND, c1.last_call, c2.last_call) AS BreakTimeInSeconds
    FROM c1,c2
    WHERE c1.calling_agent = c2.calling_agent
    AND c1.rank + 1 = c2.rank
    HAVING BreakTimeInSeconds > 600
) AS t
WHERE t.calling_agent = 9 AND 
    t.last_call > DATE_SUB( now( ) , INTERVAL 12 MONTH ) 
GROUP BY EXTRACT( DAY FROM t.last_call );
运行它


您也可以在没有临时表的情况下执行此操作,但查询可能会变得太复杂。

代理进行了多次调用,因此将多个值添加到一起。是的,但我只想在timediff大于10分钟时汇总调用之间的timediff。而且只有一天中第一次和最后一次通话之间的时间差,你能帮忙吗?我在文章结尾的例子表明,它适用于该样本数据。我建议您用更多细节(表的模式、一些示例数据、使用的确切查询、输出等)编辑您的问题
CREATE TEMPORARY TABLE c2 SELECT * FROM c1; -- create copy because sqlize doesn't allow joins with the same table.

SELECT
    DATE_FORMAT( t.last_call, '%d' ) AS 'day',
    COUNT(t.call_id) as id,
    SEC_TO_TIME(SUM(t.BreakTimeInSeconds)) AS TotalBreakTime
FROM
(
    SELECT
        c1.call_id, c1.calling_agent, c1.last_call, TIMESTAMPDIFF(SECOND, c1.last_call, c2.last_call) AS BreakTimeInSeconds
    FROM c1,c2
    WHERE c1.calling_agent = c2.calling_agent
    AND c1.rank + 1 = c2.rank
    HAVING BreakTimeInSeconds > 600
) AS t
WHERE t.calling_agent = 9 AND 
    t.last_call > DATE_SUB( now( ) , INTERVAL 12 MONTH ) 
GROUP BY EXTRACT( DAY FROM t.last_call );