仅当数据自上次记录日期以来已更改时,才将记录添加到表中

时间:2012-09-24 10:31:17

标签: mysql date merge

我需要帮助尝试找到一种只有在数据发生变化时才能将数据添加到表中的有效方法。

我有第一个表 LatestResults ,只存储最新结果(每个团队编号1个)

TeamNumber(Primary) TeamScore TeamWorkUnits RecordDateTime
1 - 500 - 600 - 2012-09-22 08:20:00
2 - 400 - 6 - 2012-09-22 08:20:00
3 - 90 - 15 - 2012-09-22 08:20:00
4 - 1 - 0 - 2012-09-22 08:20:00

另一个名为 HistoricResults 的表存储了一份非常结果的副本,以备将来需要统计数据时使用。

HisotryKey(Auto-Primary) TeamNumber TeamScore TeamWorkUnits RecordDateTime
1 - 1 500 - 600 - 2012-09-22 08:20:00
2 - 2 -400 - 6 - 2012-09-22 08:20:00
3 - 3- 90 - 15 - 2012-09-22 08:20:00
4 - 4 - 1 - 0 - 2012-09-22 08:20:00
5 - 1 490 - 600 - 2012-09-21 08:20:00
6 - 2 -300 - 6 - 2012-09-21 08:20:00
7 - 3- 40 - 15 - 2012-09-21 08:20:00
8 - 4 - 0 - 0 - 2012-09-21 08:20:00

因此,如果数据TeamScore或TeamWorkUnits自RecordDateTime的最后一条记录以来发生了变化,我想将第一个表合并到第二个表中。

如果TeamScore和TeamWorkUnits相同,则表示您保留历史记录表中最旧的条目。

如果可能的话,到目前为止,我宁愿在MySQL中完成这项工作。

目前我需要检查每小时约100,000条记录

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以尝试这种方法:

insert into HistoricResults 
  (teamNumber, TeamScore, TeamWorkUnits, RecordDateTime)
  select
    lr.teamNumber, 
    lr.TeamScore, 
    lr.TeamWorkUnits,
    NOW()
  from
    LatestResults lr
  where 
    exists (
      select 
        *
      from
        HistoricResults hs
      where
        hs.teamNumber = lr.teamNumber and
        (hs.TeamScore != lr.TeamScore or hs.TeamWorkUnits != lr.TeamWorkUnits)
        and hs.RecordDateTime = (select max(RecordDateTime) 
                                 from HistoricResults hs1 
                                 where hs1.teamNumber = lr.teamNumber)
      order by RecordDateTime desc
    )

以下是它的工作原理:exist中的子查询正在HistoricResults查找TeamScoreTeamWorkUnitsLatestResults不同的最新记录记录。如果找到此类记录,则外部select会从LatestResults中选择适当的记录,并且此类记录最终会插入HistoricResults