mysql - 插入数据并用排名填充列
问题描述
原始数据: 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 and CALL_TIME
是唯一的。 - 插入的数据中没有
RECORD_RANK
列,但RECORD_RANK
会根据MID and CALL_TIME columns
插入的时间计算。当 MID 与不同的 CALL_TIME 重复时,具有 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
将由触发器添加。
如果两个表中的行将混合,并且必须更改RECORD_RANK
已经存在的某些行,则orginal_table
无法使用一个查询执行操作(因为需要插入新行和更新现有行)。在这种情况下,我建议为列插入具有任何(NULL)值的RECORD_RANK
行,然后重新计算表中所有行的列值。
推荐阅读
- python-3.x - 如何在我的 df 中创建一个新列,即两个日期之间的天数(具有不同的数据类型)
- angular - Angular ng 测试在 RxJS 运算符上抛出错误
- php - 如何获得下面提到的数组的平均值
- android - 无法使用 dataBinding 从 xml 调用方法 ViewModel isValidate()
- nix - nixos vm 中的 nixos-shell 似乎无法识别存在的存储路径?
- javascript - 从 api 接收数据后在 ReactJS 中设置状态
- php - 无效的令牌格式谷歌人
- python - 根据参数!= None 的条件对 DataFrame 进行切片?
- amazon-web-services - 如何使用 lambda 函数和 Cloudformation 访问 S3 端点
- google-oauth - 取消谷歌 OAuth2 授权