2010-03-09 14 views
0

我們正在編寫一個MySQL數據倉庫應用程序,用於存儲與時間和生產數量數據相關聯的描述性數據(用戶ID,工作ID,機器ID,開始和結束時間列)下面的第一個表格),其上應用了聚合(SUM,COUNT,AVG)函數。我們現在希望對另一種分析的時間數據進行分解。MySQL表格數據轉換 - 我如何分解MySQL時間數據?

我們目前的數據表設計:

+---------+---------+------------+---------------------+---------------------+--------+------+ 
| User ID | Work ID | Machine ID | Event Start Time | Event End Time  | Output | Time | 
+---------+---------+------------+---------------------+---------------------+--------+------+ 
| 080025 | ABC123 | M01  | 2008-01-24 16:19:15 | 2008-01-24 16:34:45 | 2120 | 930 | 
+---------+---------+------------+---------------------+---------------------+--------+------+ 
,我們願做

再加工去匯聚將是基於分鐘的粒度轉換表中的內容,而不是目前的生產活動(「活動開始時間「和」事件結束時間「)粒度。得到的現有的錶行再處理會是什麼樣子:

+---------+---------+------------+---------------------+--------+ 
| User ID | Work ID | Machine ID | Production Minute | Output | 
+---------+---------+------------+---------------------+--------+ 
| 080025 | ABC123 | M01  | 2010-01-24 16:19 | 133 | 
| 080025 | ABC123 | M01  | 2010-01-24 16:20 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:21 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:22 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:23 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:24 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:25 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:26 | 133 | 
| 080025 | ABC123 | M01  | 2010-01-24 16:27 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:28 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:29 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:30 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:31 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:22 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:33 | 133 |  
| 080025 | ABC123 | M01  | 2010-01-24 16:34 | 133 |  
+---------+---------+------------+---------------------+--------+ 

所以再處理將採取在生產活動的粒度創建的數據的現有行和修改粒度分鐘,消除冗餘(活動結束時間,時間),而這樣做。它假定生產率恆定,並將產出除以分鐘加上一個的差值以填充新表的「輸出」列。

我知道這可以在代碼中完成......但它可以完全在MySQL插入語句(或完全在MySQL中)完成?我正在考慮INSERT ... INTO施工,但一直陷入困境。另外一個複雜的情況是,操作中需要包含數百臺機器,因此每天的每一分鐘都會有多行(每臺機器一臺)。

任何想法將不勝感激。謝謝。

回答

2

您可以創建一個包含行從您的數據集中到結束的開始每分鐘一臺,並運行加入對抗:

select user_id, work_id, machine_id, production_minute, output 
from prod_event p 
join prod_minute m on p.start <= m.production_minute and m.production_minute <= p.end; 

填充prod_minute表可以很有趣:

create table counter (i int not null auto_increment primary key); 
insert into counter values (0); 
insert into counter select NULL from counter; 
# ... repeat until your counter table contains enough minutes 

create table prod_minute (production_minute datetime not null primary key); 
insert into prod_minute select date_add('2000-01-01', interval i minute) from counter; 
+0

謝謝馬丁!這種方法可以完美地適用於單臺機器。另外的複雜性是我們報告了219臺機器,其中一些介於0和219之間的機器可能同時運行。因此,production_minute列的值可能在1到219之間,具體取決於在那一分鐘內運行的機器數量。我們可以添加另一列作爲PK,以使production_minute不唯一,但是我們如何根據實際在那一分鐘內運行的機器數量,重複生產_分鐘的相同時間戳可變的次數? – lighthouse65 2010-03-09 16:00:45

+0

如果您的所有數據都位於單個prod_event表中,則單個連接應涵蓋所有user_id,work_id,machine_id和output。給它一個小提取物 - 它應該只是工作。 – Martin 2010-03-09 16:22:42

+0

我看到...會嘗試併發回...再次感謝。 – lighthouse65 2010-03-09 17:16:21