mysql - 插入数据并用排名填充列

标签 mysql sql count sql-update mysql-5.5

原始数据:原始表

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 中最简单的行总是晚于 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) 值的行列,然后重新计算表中所有行的列值。

    关于mysql - 插入数据并用排名填充列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65389754/

    相关文章:

    php - 数据库备份后丢失了一大块帖子

    sql - Postgresql 运算符类 "varchar_pattern_ops"不接受数据类型整数

    java - SQL 选择时间戳列位于两个时间戳之间的位置

    Python:计算数据框列中所有行中特定字符的实例

    MySQL 数据透视表

    php - SQL - 选择彼此相似的 %...% 的所有行(所有相似的行)

    mysql - 覆盖mysql表数据

    mysql - 返回以字母 (a-z) 开头的前 3 个结果

    javascript - 测验 - 计算单选按钮值

    如果符号之间没有空格,C 计数字程序就可以工作,为什么?