首页 > 解决方案 > 插入数据并用排名填充列

问题描述

原始数据: original_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  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

笔记

标签: mysqlsqlcountsql-updatemysql-5.5

解决方案


如果最先行insert_table总是晚于最新行,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将由触发器添加。

小提琴


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


推荐阅读