【问题标题】:My mySQL call is only returning one value to average where it should be returning all我的 mySQL 调用只返回一个值来平均应该返回所有值
【发布时间】:2012-12-08 06:26:10
【问题描述】:

这是我的 mySQL 语句:

    SELECT DATE(x.created_at), AVG(TIMEDIFF(y.created_at, x.created_at)/60/60)
    FROM 
        (SELECT *
            FROM events a 
            WHERE a.created_at > '12-10-10 12:12:12'
                AND a.type = 'Started') x INNER JOIN

        (SELECT *
            FROM events a 
            WHERE a.created_at > '12-10-10 12:12:12'
                AND a.type = 'Complete') y ON x.target_id = y.target_id
    GROUP BY DATE(x.created_at)
    ORDER BY DATE(x.created_at)    

理想情况下,我试图获得每个日期的运行中位数。因此,对于每个日期,选择 created_at 列之间的时间差,并找到该日期所有值之间的中值 TIMEDIFF。依此类推,直到每个日期都有相应的complete

作为一个较短的目标,我上面的代码块只是“平均”(因为我无法计算出中位数),每个日期的最后一个返回值,而不是所有日期的所有那个日期。

有任何提示、提示、答案吗?

【问题讨论】:

  • 您正在按DAYOFYEAR 进行分组,但您选择的是DATE... 如果我们能看到events 表的结构,我们也希望如此。
  • Events 表有一个created_attype 列。我还删除了 group by 和 order by 语句,它仍然只会返回最后一个对象。
  • 你能为此创建一个 SQL 小提琴吗? www.sqlfiddle.com
  • 我会将您的组更改为 DATE(x.created_at)。或者更改您的选择以显示 DAYOFYEAR(x.created_at)。
  • 嗯.. 我更新为反映 DATE 而不是 DAYOFYEAR 但它仍然只提供该日期的最后一个返回对象的计算。在 sqlfiddle 上工作..

标签: mysql math median cumulative-sum


【解决方案1】:

鉴于数据适合测试,我们的查询似乎有效。请参阅此更正的 SQL Fiddle:http://sqlfiddle.com/#!2/8458d/3/0

但是,查询可以简化为

SELECT DATE(a.created_at),
       AVG(TIMEDIFF(b.created_at, a.created_at)/60/60)
FROM events a
INNER JOIN events b
ON a.target_id = b.target_id
WHERE a.created_at > '2012-10-10 12:12:12'
AND a.type = 'Started'
AND b.created_at > '2012-10-10 12:12:12' -- not needed?
AND b.type = 'Completed'
GROUP BY DATE(a.created_at)
ORDER BY DATE(a.created_at) 

【讨论】:

  • @Trip 使用数据几天,匹配查询,您的查询似乎给出了正确的结果。在我的查询中,我打错了字(ẁriting WHERE 而不是 AND 在可能多余的行中)。它现在已修复,并给出与您相同的结果。
猜你喜欢
  • 2016-02-20
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多