我们正在为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构建,但一直陷入困境。另一个复杂因素是操作中包含数百台机器,因此每天每分钟都会有多行(每台机器一行)。
任何想法都会非常感激。感谢。
答案 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;