表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
答案 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
有几个问题突出:
created
。这不是一个实际的问题,但确实会影响性能,所以你应该牢记这一点。GROUP BY 1
但它是有效的(每天都学到新东西)。在这种情况下,它基本上意味着GROUP BY ticket_id
(SELECT
中的第一列)。我不认为这是有效的,因为您选择了3列但是您只按1列分组。HAVING
将响应限制在一行,但在这种情况下,它意味着返回结果,它给出了ticket_id出现多次的结果。我的MySQL有点生疏,但我认为没错。
我觉得我很困惑,但你可能需要做的不是使用子查询,而是使用分组和/或加入。也许您可以使用您在查询中提供的架构发布一个简短的示例。像http://sqlfiddle.com/这样的东西对于那些查看问题和自己调试的人来说非常方便。
还有其他几个答案可能会有所帮助: