mysql - 计算同一个表上的行之间的平均时间差

标签 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

最佳答案

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

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_id(SELECT中的第一列)。我认为这无效,因为您选择了 3 列,但只按 1 列进行分组。
  3. 我认为您正在尝试使用 HAVING 将响应限制为一行,但在本例中,这意味着返回的结果为我提供的 Ticket_id 多次出现的结果。

我的 MySQL 有点生疏,但我认为这是对的。

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

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

关于mysql - 计算同一个表上的行之间的平均时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28334328/

相关文章:

php - 如何获取所选年份的所有日期?

mysql - 即使没有返回数据也检索 COUNT()

sql - 解释分析语句中的循环是什么意思?

python - webdriver.support.select - Select 不与元素交互

MySQL:查询时间序列中某个日期之前的最后一个值的最佳实践

mysql - 在 JOIN jquery 中选择最后一个日期和 COUNT 行?

mysql - GitHub 操作 : How to run `services` on Windows or macOS?

mysql - JOIN UPDATE mysql,无法正常工作

select - 如何使用数组作为 react 选择组件的选项

mysql - 使用mysql LIMIT关键字选择自增id不一致的数据