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";

これらのレコードは、それぞれ1日1回更新されます。平均して、各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

もう1つのオプションは、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 

デモ

グループを削除して中間結果を確認することで、これが実際に動作していることを確認する価値があります。

于 2013-03-25T20:14:09.220 に答える