我曾經刺過這個東西,我真的很想看看其他人會如何解決它。
我以前有類似的問題,並通過創建一個時間索引表,然後基於重寫時間來適應時間框架來加入數據表來解決它。問題是你需要一個新的時間索引表和單獨的查詢或查看每個時間間隔。
以這種方式加入數據的好處是,我對沒有閱讀或結果的時間範圍感興趣,所以我需要在特定的時間範圍內看到空值或沒有閱讀。最終的數據只需要一些額外的工作(即:取出佔位符)。
我做的第一件事,就是創建一個時間索引表,它看起來是這樣的....
mysql> select * from ctb_time_idx WHERE YEAR(ctb_datetime) = 2013 LIMIT 10 ;
+---------------------+
| ctb_datetime |
+---------------------+
| 2013-01-01 00:00:00 |
| 2013-01-01 00:15:00 |
| 2013-01-01 00:30:00 |
| 2013-01-01 00:45:00 |
| 2013-01-01 01:00:00 |
| 2013-01-01 01:15:00 |
| 2013-01-01 01:30:00 |
| 2013-01-01 01:45:00 |
| 2013-01-01 02:00:00 |
| 2013-01-01 02:15:00 |
+---------------------+
10 rows in set (0.07 sec)
我那麼工會我的
(select
ctb_datetime AS time1 ,
'Placeholder' AS TimeInterval ,
NULL AS `Col A` ,
NULL AS `Col B`
from my_time_idx
where YEAR (ctb_time_idx.ctb_datetime ) = 2013)
UNION
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:00') AS time1 ,
'00min' AS TimeInterval , `Col A` , `Col B` from my_data_table
where MINUTE(time1) BETWEEN 00 AND 14 )
UNION
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:15') AS time1 ,
'15min' AS TimeInterval, `Col A` , `Col B` from my_data_table
where MINUTE(time1) BETWEEN 15 AND 29 )
UNION
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:30') AS time1 ,
'30min' AS TimeInterval, `Col A` , `Col B` from my_data_table
where MINUTE(time1) BETWEEN 30 AND 44 )
UNION
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:45') AS time1 ,
'45min' AS TimeInterval, `Col A` , `Col B` from my_data_table
where MINUTE(time1) BETWEEN 45 AND 59 )
order by time1
數據我對這個測試我的舊桌子,它似乎工作正常,我不得不重新編輯我的代碼,以適應你的例子,所以希望我沒有搞砸了。
可能重複[取樣SQL時間序列](http://stackoverflow.com/questions/7335627/sampling-sql-timeseries) – Domi