1

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

2 回答 2

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
于 2013-03-25T19:23:24.973 回答
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 

演示

通过删除 group by 并查看中间结果来看到这一点是值得的

于 2013-03-25T20:14:09.220 回答