【问题标题】:Trouble with MySQL query using AVG()使用 AVG() 查询 MySQL 的问题
【发布时间】:2013-03-25 19:08:49
【问题描述】:

我正在使用一个查询,该查询对每个给定 id 的所有记录进行平均...

$query = "SELECT bline_id, AVG(flow) as flowavg 
          FROM blf 
          WHERE bline_id BETWEEN 1 AND 30 
          GROUP BY bline_id 
          ORDER BY bline_id ASC";

这些记录每天更新一次。我想只使用平均每个 id 的 10 条最新记录。

非常感谢任何帮助。

blf 表结构为:

id | bline_id | flow | date

【问题讨论】:

  • 所以你想使用LIMIT 10?
  • +1 您还需要按日期降序排列以获得“我的平均每个 id 的最新记录”。
  • LIMIT 10 仅允许您显示 10 个 id 的平均结果,例如查看 DESC 时为 30-21 或查看 ASC 时为 1-11。

标签: php mysql average


【解决方案1】:

如果这些真的每天都在更新,那就用日期算术吧:

SELECT bline_id, AVG(flow) as flowavg
FROM blf
WHERE bline_id BETWEEN 1 AND 30 and
      date >= date_sub(now(), interval 10 day)
GROUP BY bline_id
ORDER BY bline_id ASC

否则,您必须放入一个计数器,您可以使用相关子查询来做到这一点:

SELECT bline_id, AVG(flow) as flowavg
FROM (select blf.*,
             (select COUNT(*) from blf blf2 where blf2.bline_id = blf.bline_id and blf2.date >= blf.date
             ) seqnum
      from blf
     ) blf
WHERE bline_id BETWEEN 1 AND 30 and
      seqnum <= 10
GROUP BY bline_id
ORDER BY bline_id ASC

【讨论】:

  • 第一个选项听起来像我想要的,但没有返回任何东西?
  • @user2039676 。 . .不知何故,select 这个词在错误的地方潜入了查询。
  • @user2039676 。 . .日期方法更简单,更容易理解。另一种方法效率较低。我会使用 date 方法,但倾向于在 select 列表中包含 count(*) 以查看实际选择了多少个日期。
  • 我会试一试的。太感谢了!接下来,我必须弄清楚如何计算每天更新时价值的 +- 2% 变化!
  • @GordonLinoff turns out 周末介绍了一个问题。认为第一个查询可以处理这个问题吗?我想最大的问题是处理NOW() 是星期六或星期日。
【解决方案2】:

另一个选项是模拟 ROW_NUMBER()。

此语句创建一个计数器并在每次遇到新的 bline_id 时将其重置。然后它会过滤掉所有不在前 10 行中的记录。

SELECT bline_id, 
       Avg(flow) avg 
FROM   (SELECT id, 
               bline_id, 
               flow, 
               date, 
               CASE 
                 WHEN @previous IS NULL 
                       OR @previous = bline_id THEN @rownum := @rownum + 1 
                 ELSE @rownum := 1 
               end rn, 
               @previous := bline_id 
        FROM   blf, 
               (SELECT @rownum := 0, 
                       @previous := NULL) t 
        WHERE bline_id > 0 and bline_id < 31
        ORDER  BY bline_id, 
                  date DESC, 
                  id) t 
WHERE  rn < 11
GROUP  BY bline_id 

DEMO

通过删除组并查看intermediate results 来查看此操作是值得的

【讨论】:

  • 非常好。我明天试试看!
  • 效果也很好。我将运行这两个示例并比较一段时间。感谢您的帮助!
  • @user2039676 欢迎您。我认为 Gordon 的第一个是正确的方法,因为你有很好的每天更新一次。然而,并不是每个人都这么幸运。
  • 其实我忘记了周末不更新所以第一个版本从来没有提交总共10条记录,因为它没有看到10个连续的日期。戈登的第二个选项,你的返回相同的结果:)
  • 我不想强加于你帮助我解决这个问题的慷慨,但从你的声誉来看,你可能是为我指明实现下一步目标方向的合适人选这个项目!准备好迎接挑战了吗?
猜你喜欢
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多