2014-10-31 15 views
0

我有一個表是這樣的:平均從一個表的重複數據在MySQL

+----+---------------------+----------+ 
| ID | startDate   | uvIndex | 
+----+---------------------+----------+ 
| 1 | 2014-10-29 06:37:21 | 120  | 
| 2 | 2014-10-29 08:57:00 | 135  | 
| 3 | 2014-10-28 05:37:21 | 120  | 
| 4 | 2014-10-28 09:30:21 | 160  | 
| 5 | 2014-10-28 10:28:21 | 150  | 
| 6 | 2014-10-26 16:27:01 | 150  | 
| 7 | 2014-10-26 17:57:21 | 110  | 
+----+----------+-----+---------------+ 

從那裏,我想不同的價值觀,但如果數據是重複的則是數據的平均值應該來。就像這樣:

+----+-------------+---------------+ 
| ID | startDate | AVG(uvIndex) | 
+----+-------------+---------------+ 
| 1 | 2014-10-29 | 127.5   | 
| 2 | 2014-10-28 | 98.33   | 
| 3 | 2014-10-26 | 130   | 
+----+----------+-----+------------+ 

我試圖至今:

SELECT AVG(accumulatedLux), startTime FROM `blutooth_accumulated_data` WHERE `startTime` BETWEEN '2014-10-25' AND '2014-10-30' GROUP BY startTime 

請幫助我。

回答

2

據我所知,你的查詢應該產生你想要的數據。唯一的問題是id,你可以使用變量。這是否做你想要的?

SELECT (@id := @id + 1) as id, startTime, AVG(accumulatedLux) 
FROM `blutooth_accumulated_data` CROSS JOIN 
     (SELECT @id := 0) vars 
WHERE `startTime` BETWEEN '2014-10-25' AND '2014-10-30' 
GROUP BY startTime 
ORDER BY startTime; 

一種可能的併發症是如果StartTime具有時間組件。如果是這樣,你想要這個:

SELECT (@id := @id + 1) as id, date(startTime) as startDate, AVG(accumulatedLux) 
FROM `blutooth_accumulated_data` CROSS JOIN 
     (SELECT @id := 0) vars 
WHERE date(startTime) BETWEEN '2014-10-25' AND '2014-10-30' 
GROUP BY date(startTime) 
ORDER BY date(startTime); 

和一個小紙條。所以,你可以在startTime使用索引,你應該寫的where子句:

WHERE startTime >= date('2014-10-15') and startTime < date('2014-10-30') + interval 1 day 
+0

是的,我有時間的組件。 – Poles 2014-10-31 10:44:11

+0

當您使用相同的表達式進行分組時,'ORDER BY expr''是多餘的。 – saaj 2014-10-31 10:56:16

+0

藉助日期組件我也得到了相同的結果。 'SELECT AVG(cumulativeLux),date(startTime)FROM blutooth_accumulated_data WHERE date(startTime)BETWEEN'2014-10-25'和'2014-11-30'GROUP BY date(startTime)' – Poles 2014-10-31 10:57:34