计算同一个表中行之间的平均时间差

时间:2015-02-05 00:45:12

标签: mysql select

表sca_ticket_thread存储状态更改日期。我试图计算两种状态之间的平均时差。 “created”列存储状态更改的日期,“body”列存储状态更改。

SELECT AVG(DateDiff((SELECT created FROM 
(SELECT created 
FROM sca_ticket_thread 
WHERE body = 'AchangetoB'
OR body = 'BchangetoC'
GROUP BY ticket_id
HAVING count(*) > 1)
as subquery),
(SELECT created 
FROM sca_ticket_thread 
WHERE body = 'BchangetoC' 
ORDER BY ticket_id))) 
FROM sca_ticket_thread

我收到的错误是:#1242 - 子查询返回超过1行

我(从概念上讲,一点点)理解子查询不能返回超过1行。我已经考虑将一张桌子加入到自身作为一种可能的解决方案,但我认为这不是正确的前进道路。

最终,我想生成从A到B,从B到C到D等的平均状态变化。

ID | STATUS   | DATE
--------------------------
1  | Status A | 02/01/2015
1  | Status A | 02/02/2015
2  | Status B | 02/03/2015

1 个答案:

答案 0 :(得分:0)

让我们来看看您的最新查询:

SELECT AVG(DateDiff(
  (SELECT created FROM (
    SELECT ticket_id, created, body
    FROM sca_ticket_thread
    WHERE body = 'AchangetoB' OR body = 'BchangetoC'
    GROUP BY 1
    HAVING count(*) > 1) as subquery),
  (SELECT created FROM sca_ticket_thread WHERE body = 'BchangetoC' ORDER BY ticket_id))) 
FROM sca_ticket_thread

有几个问题突出:

  1. 您的子查询返回多个列(ticket_id,created和body)但您实际上并未使用它们,因此您应该只检索created。这不是一个实际的问题,但确实会影响性能,所以你应该牢记这一点。
  2. 我不了解GROUP BY 1但它是有效的(每天都学到新东西)。在这种情况下,它基本上意味着GROUP BY ticket_idSELECT中的第一列)。我不认为这是有效的,因为您选择了3列但是您只按1列分组。
  3. 我认为你试图用HAVING将响应限制在一行,但在这种情况下,它意味着返回结果,它给出了ticket_id出现多次的结果。
  4. 我的MySQL有点生疏,但我认为没错。

    我觉得我很困惑,但你可能需要做的不是使用子查询,而是使用分组和/或加入。也许您可以使用您在查询中提供的架构发布一个简短的示例。像http://sqlfiddle.com/这样的东西对于那些查看问题和自己调试的人来说非常方便。

    还有其他几个答案可能会有所帮助: