MySQL表数据转换 - 如何解析MySQL时间数据?

时间:2010-03-09 01:12:07

标签: sql mysql

我们正在为MySQL数据仓库应用程序编码,该应用程序存储与时间和生产数量数据相关的描述性数据(用户ID,工作ID,机器ID,开始和结束时间列)(输出和时间列)下面的第一个表)应用聚合(SUM,COUNT,AVG)函数。我们现在希望对另一种分析的时间数据进行反汇总。

我们目前的数据表设计:

+---------+---------+------------+---------------------+---------------------+--------+------+
| 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构建,但一直陷入困境。另一个复杂因素是操作中包含数百台机器,因此每天每分钟都会有多行(每台机器一行)。

任何想法都会非常感激。感谢。

1 个答案:

答案 0 :(得分: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;