Mysql 在新表中汇总数据

Mysql 在新表中汇总数据,mysql,Mysql,在将数据放入状态_表的过程中,问题如下(一天最多可达4000个条目 在晚上,我想把数据以一种更有条理的方式放在一个存储表中 (状态表存储)并将其从状态表中删除。 这样做的目的是将所有状态相同的条目分组,直到状态/错误发生变化。从这一点开始,新的组应该被放入表中。可以在fiddle中找到一个示例 最好的方法是什么 表结构的示例可在此处找到:逐步说明: 首先,按名称和时间戳对表进行排序,并初始化三个 如您所见,我们可以使用子查询来实现这一点。orderby很重要,因为关系数据库中没有顺序,除非您指定

在将数据放入状态_表的过程中,问题如下(一天最多可达4000个条目

在晚上,我想把数据以一种更有条理的方式放在一个存储表中 (状态表存储)并将其从状态表中删除。 这样做的目的是将所有状态相同的条目分组,直到状态/错误发生变化。从这一点开始,新的组应该被放入表中。可以在fiddle中找到一个示例

最好的方法是什么


表结构的示例可在此处找到:

逐步说明:

首先,按名称和时间戳对表进行排序,并初始化三个

如您所见,我们可以使用子查询来实现这一点。
orderby
很重要,因为关系数据库中没有顺序,除非您指定它

现在,MySQL按照指定的顺序计算
SELECT
子句,因此不要在这里更改顺序

SELECT 
s.*,
@prevName,
@prevStatus,
@prevName := s.name,
@prevStatus := s.status
FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
当您执行此语句时,您可以看到,当我们简单地选择变量时,它们保存前一行的值,或者当它是第一行时为NULL,这是已读取的。然后,当前行的值被分配给变量。因此,我们现在可以将当前行与前一行进行比较。如果有什么变化,我们只需增加第三个变量,是我们正在构建的每个“组”的数字

SELECT 
s.*,
@group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number,
@prevName := s.name,
@prevStatus := s.status
FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
因此,当某些东西发生变化时,我们增加了
@groupu\u编号
,如果不发生变化,则将变量分配给自身,使其不发生变化

现在我们可以简单地将这个查询用作子查询并进行简单的分组

SELECT 
group_number AS id, 
name, 
status, 
MIN(error) AS error, 
MIN(timestamp) AS firstEntry,
MAX(timestamp) AS lastEntry,
COUNT(*) AS entries
FROM (
    SELECT 
    s.*,
    @group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number,
    @prevName := s.name,
    @prevStatus := s.status
    FROM status_table s
    , (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
    ORDER BY name, timestamp
) sq
GROUP BY 
group_number, 
name, 
status
  • 看到它在这里面工作了吗
SELECT 
group_number AS id, 
name, 
status, 
MIN(error) AS error, 
MIN(timestamp) AS firstEntry,
MAX(timestamp) AS lastEntry,
COUNT(*) AS entries
FROM (
    SELECT 
    s.*,
    @group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number,
    @prevName := s.name,
    @prevStatus := s.status
    FROM status_table s
    , (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
    ORDER BY name, timestamp
) sq
GROUP BY 
group_number, 
name, 
status