表 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
最佳答案
让我们看看您最新的查询:
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
有几个问题很突出:
- 您的子查询返回多个列(ticket_id、created 和 body),但您实际上并未使用它们,因此您应该只检索
created
。这不是一个实际问题,但它确实会影响性能,因此您应该记住这一点。 - 我不知道
GROUP BY 1
,但它是有效的(每天学习新东西)。在这种情况下,它基本上意味着GROUP BY Ticket_id
(SELECT
中的第一列)。我认为这无效,因为您选择了 3 列,但只按 1 列进行分组。 - 我认为您正在尝试使用
HAVING
将响应限制为一行,但在本例中,这意味着返回的结果为我提供的 Ticket_id 多次出现的结果。
我的 MySQL 有点生疏,但我认为这是对的。
我想我很困惑,但你可能需要做的不是使用子查询,而是使用分组和/或加入。也许您可以使用您在查询中提供的架构发布一个简短的示例。类似于 http://sqlfiddle.com/对于查看问题的人和您自己的调试来说非常方便。
还有其他几个可能有帮助的答案:
关于mysql - 计算同一个表上的行之间的平均时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28334328/