2014-03-14 103 views
6

我想要在單個SQL中完成以下操作。以一分鐘爲增量選擇分鐘平均值

我想在9:00到17:30之間以1分鐘爲增量選擇所有時間,而不使用for循環。有沒有辦法做到這一點?

select avg(price), Date(timecolumn) 
from table 
where Time(timeColumn) >= '09:00:00' 
and Time(timeColumn) <= '09:01:00' 
+1

告訴我們你正在使用哪個數據庫系統。 –

回答

2

您可以通過日期,小時和分鐘必須組。

SELECT AVG(price), DATE(timecolumn), HOUR(timecolumn), MINUTE(timecolumn) 
FROM `table` 
WHERE TIME(timeColumn) >= '09:00:00' AND TIME(timeColumn) <= '17:01:00' 
GROUP BY DATE(timecolumn), HOUR(timecolumn), MINUTE(timecolumn) 
+0

當然,它很簡單,我不能立即看到解決方案:) – user2130951

+0

@xdazz - 我不知道他在用什麼數據庫 - 但是投射一列或用(UPPER/LOWER等)修改將會消除索引(在informix中) - 因此導致查詢引擎對這個SELECT運行一個順序掃描。如果他/她正在使用的引擎的確如此,那麼可能會因爲大型記錄集而變慢 – Trent

1

我在這裏假設最大的障礙是你想保留(和返回)行的零(或空值) - 也就是說,在你table表中沒有行一分鐘爲單位。

您可能需要考慮在數據庫中添加一個包含時間的表。例如:

FullTime TIME, 
Hour INT, 
Minute INT, 
Second INT 

86400行讓您精確到秒,您可以在其上放置索引。

然後,你可以用這個表連接:

SELECT AVG(Price), DATE(timeColumn) 
FROM times 
LEFT OUTER JOIN myTable ON times.FullTime = myTable.timeColumn 
WHERE times.timeColumn BETWEEN '09:00:00' AND '17:30:00' 
AND times.Seconds = 0 
GROUP BY times.FullTime 
+0

偉大的解決方案,結合我現在使用的兩步法。 – user2130951