【问题标题】:MySQL AVG of TIMESTAMPDIFF function with WHERE CLAUSE带有 WHERE CLAUSE 的 TIMESTAMPDIFF 函数的 MySQL AVG
【发布时间】:2014-07-07 15:24:41
【问题描述】:

我有一张表,我试图从中获取平均持续时间。我正在使用以下代码

/*TIME DURATION*/
SELECT DATE(createDate),
AVG(TIMESTAMPDIFF(SECOND, min(createDate), max(createDate))) AS Duration
FROM Impressions
WHERE session_id IN (
    SELECT session_id
    FROM carts
    WHERE createDate >= '2014-06-30'AND createDate < '2014-07-07'
        AND HOUR(createDate) >= 10
        AND HOUR(createDate) < 21
    )

AND session_Id <> ''
GROUP BY DATE(createDate);

但是,我收到以下错误,无法理解原因。任何帮助将不胜感激。

错误代码:-2147467259,编号:1111 ErrorMessage:组功能使用无效

【问题讨论】:

  • createDate的类型是什么
  • 问题是 MIN 和 MAX 函数嵌套在 AVG 函数中。太多的分组功能。事实上,如果你删除 MIN 和 MAX 函数,你不会得到任何错误。
  • @JorgeCampos: createDate 是类型 DATETIME @GiulioDeMarco: 有解决办法吗?我需要计算持续时间,这就是 MIN 和 MAX 存在的原因。
  • 你用minmax创建一个子查询怎么样?'masterquery'会在子查询的这个字段上做平均?!
  • 你介意给我举个例子吗?我是 mySQL 的新手,所以这将是一个很好的学习机会

标签: mysql sql timestamp average


【解决方案1】:

我建议您使用这样的查询:

SELECT DATE(tbl.createDate),
       AVG(TIMESTAMPDIFF(SECOND, tbl.minDt, tbl.maxDt)) AS Duration  
  FROM (SELECT DATE(i.createDate) as createDate,
               min(i.createDate) minDt,
               max(i.createDate) maxDt
          FROM Impressions i INNER JOIN
               carts c ON (i.session_id = c.session_id)
         WHERE c.createDate >= '2014-06-30' 
           AND c.createDate < '2014-07-07'
           AND HOUR(c.createDate) >= 10
           AND HOUR(c.createDate) < 21
           AND i.session_Id <> ''
         GROUP BY DATE(i.createDate) ) as tbl
 GROUP BY DATE(tbl.createDate);

【讨论】:

  • 让我试试这个,@Jorge。我很难理解 JOIN。当我看到代码时,它们看起来很简单,但是当我尝试编写我的代码时,事情变得一团糟。您是否可以指出可以帮助我的资源?通过示例和简短的练习,我学得最好。
  • @eager_learner313 在阅读大量文章和材料的多年经验(到现在已经超过 16 年)中,我学到了关于 SQL 连接的最佳实践,当然也犯了很大的错误。所以很难指出我读过的所有内容,但在 SO 上有一个问题:Good methods or tutorials for understanding JOINs in SQL 我快速浏览了一下,发现它非常有用且易于理解。
  • 我继续进行了一些其他更正。如果您不按createDate, session_id 分组,则不会计算正确的平均值,因为我们正在查看平均会话长度。此外,createDate 有一个问题,我已修复 :)
  • 很好。最主要的是你学到了一些新东西,这是我在这里的目的,帮助和学习。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多