微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

插入数据并用排名填充列

如何解决插入数据并用排名填充列

原始数据:orginal_table

MID STATE CALL_TIME         RECORD_RANK
a   1    2020-12-18 09:00:00        1
a   2    2020-12-19 09:00:00        2
b   1    2020-12-18 09:00:02        1
c   1    2020-12-18 09:00:03        1
c   1    2020-12-19 09:00:03        2
c   1    2020-12-20 09:00:03        3
d   1    2020-12-19 09:00:00        1

我想插入的数据:insert_table

   MID  STATE      CALL_TIME  
   a    2     2020-12-30 09:00:00      
   b    2     2020-12-19 09:00:02   
   c    1     2020-12-21 09:00:03 
   e    1     2020-12-30 09:00:00 
   f    1     2020-12-30 09:00:00 
   f    2     2020-12-31 09:00:00

目标

  • 将从第二个数据插入原始数据。
  • 对于原始数据和插入数据,MID and CALL_TIME 对是唯一的。
  • 插入的数据中没有RECORD_RANK列,但插入时会根据RECORD_RANK计算MID and CALL_TIME columns。当用不同的 CALL_TIME 复制 MID 时,带有 MID 的 RECORD_RANK 的值将加 1。初始值为 1。
  • insert_table 中最早的行总是晚于 orginal_table 中具有相同 MID 的最新行。

预期的示例结果如下:

MID  STATE      CALL_TIME         RECORD_RANK
a    1    2020-12-18 09:00:00        1
a    2    2020-12-19 09:00:00        2
b    1    2020-12-18 09:00:02        1
c    1    2020-12-18 09:00:03        1
c    1    2020-12-19 09:00:03        2
c    1    2020-12-20 09:00:03        3
d    1    2020-12-19 09:00:00        1
a    2    2020-12-30 09:00:00        3
b    2    2020-12-19 09:00:02        2  
c    1    2020-12-21 09:00:03        4
e    1    2020-12-30 09:00:00        1
f    1    2020-12-30 09:00:00        1 
f    2    2020-12-31 09:00:00        2

注意

  • MysqL 版本:5.5.47-log

解决方法

如果 insert_table 中的 easiest 行总是晚于 orginal_table 中具有相同 MID 的最新行,那么您可以使用 BEFORE INSERT 触发器:

CREATE TRIGGER tr_bi_original
BEFORE INSERT
ON orginal_table
FOR EACH ROW
SET NEW.RECORD_RANK = (SELECT COALESCE(COUNT(*),0) + 1
                       FROM orginal_table
                       WHERE NEW.MID = orginal_table.MID)

触发器创建后,您可以简单地添加新行

INSERT INTO orginal_table
SELECT *,NULL FROM insert_table;

RECORD_RANK 的新值将由触发器添加。

fiddle


如果两个表中的行将混合,并且必须更改 RECORD_RANK 中已经存在的某些行的 orginal_table,则无法使用一个查询执行该操作(因为插入新行和更新现有的需要)。在这种情况下,我建议为 RECORD_RANK 列插入具有任何 (NULL) 值的行,然后重新计算表中所有行的列值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。