使用AVG()查询MySQL的麻烦

时间:2013-03-25 19:08:50

标签: php mysql average

我正在使用一个查询,该查询获取每个给定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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

另一种选择是模拟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

,可以看到这一点