故障使用AVG()MySQL查询

问题描述:

我使用的查询需要的所有记录每一个给定id的平均...故障使用AVG()MySQL查询

$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 
+2

所以要使用'LIMIT 10'看到这个动作? – UnholyRanger 2013-03-25 19:11:14

+1

+1您还需要按日期降序获取“我平均每个ID的最新记录”。 – user1477388 2013-03-25 19:12:42

+0

LIMIT 10只允许显示10个ID的平均结果,例如当查看DESC时30-21或ASC时1-11。 – bech64 2013-03-25 19:31:30

另一个选项是模拟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

+0

非常好。我明天会试一试! – bech64 2013-03-25 23:52:34

+0

这也很好。我将运行这两个示例并比较一段时间。感谢您的帮助! – bech64 2013-03-26 15:52:34

+0

@ user2039676您的欢迎。我认为Gordon的第一个是正确的方法,因为你拥有每天更新一次的好*。然而,并非每个人都如此幸运。 – 2013-03-26 15:54:59

如果这些每天都在真正的更新,然后使用日期计算:

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 
+0

第一个选项听起来像我想要的但不返回任何东西? – bech64 2013-03-25 19:33:40

+0

@ user2039676。 。 。不知怎的,单词'select'爬到错误位置的查询中。 – 2013-03-25 19:37:57

+0

现在他们都工作得很好!你会推荐哪种方式? – bech64 2013-03-25 19:42:13