2013-03-25 63 views
1

我使用的查詢需要的所有記錄每一個給定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

回答

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

+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

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