Mariadb UPDATE table 可以用一个命令向上移动所有行吗?
Mariadb UPDATE table to move all rows up with one command possible?
在 MariaDB 我有这个 table:
OHCL
|------
|Column|Type|Null|Default
|------
|//**id**//|int(3)|No|
|index_minus|int(10)|No|0
|timestamp|int(11)|Yes|NULL
|year|int(4)|Yes|NULL
|month|int(2)|Yes|NULL
|day|int(2)|Yes|NULL
|hour|int(2)|Yes|NULL
|minute|int(2)|Yes|NULL
|close|float|Yes|NULL
|MFA_short|float|Yes|NULL
|MFA_long|float|Yes|NULL
|volume|float|Yes|NULL
|count|int(10)|Yes|NULL
== Dumping data for table OHCL
|1|0|1619743800|2021|4|30|2|50|0.3036|NULL|NULL|97852.6|41
|2|1|1619744100|2021|4|30|2|55|0.30358|NULL|NULL|221278|45
|3|2|1619744400|2021|4|30|3|0|0.303548|NULL|NULL|41685|30
|4|3|1619744700|2021|4|30|3|5|0.304009|NULL|NULL|158091|23
我需要将 id
和 index_minus
以外的每一行“移动”(或移动?不确定哪个术语最能说明这一点)向上移动 1,因此丢弃 id = 1 的行。行720 应填充默认值。最后一行中的默认值并不那么重要。我将在下一步中用新数据更新这一行。我只是想,如果这完全可能的话,那么默认值就是可行的方法。
结果应该是这样的:
|1|0|1619744100|2021|4|30|2|55|0.30358|NULL|NULL|221278|45
|2|1|1619744400|2021|4|30|3|0|0.303548|NULL|NULL|41685|30
|3|2|1619744700|2021|4|30|3|5|0.304009|NULL|NULL|158091|23
|4|3|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL
我试了一段时间了,但不知道这是否可行?
试图只移动一个列进行测试,我得到的最接近的是这样的:
UPDATE OHCL SET minute = LEAD(minute) OVER (ORDER BY id) AS minute
但这没有用。
我是 SQL 的新手。这甚至可以通过单个命令实现吗?
使用LAG()
window 函数获取每行的前id
并连接到table 以更新行:
UPDATE OHCL o
LEFT JOIN (
SELECT *, LAG(id) OVER (ORDER BY id) prev_id
FROM OHCL
) t ON t.prev_id = o.id
SET o.timestamp = t.timestamp,
o.year = t.year,
o.month = t.month,
o.day = t.day,
o.hour = t.hour,
o.minute = t.minute,
o.close = t.close,
o.MFA_short = t.MFA_short,
o.MFA_long = t.MFA_long,
o.volume = t.volume,
o.count = t.count;
查看demo。
如果 id
之间没有间隙,使用自连接会更容易:
UPDATE OHCL o1
LEFT JOIN OHCL o2
ON o2.id = o1.id + 1
SET o1.timestamp = o2.timestamp,
o1.year = o2.year,
o1.month = o2.month,
o1.day = o2.day,
o1.hour = o2.hour,
o1.minute = o2.minute,
o1.close = o2.close,
o1.MFA_short = o2.MFA_short,
o1.MFA_long = o2.MFA_long,
o1.volume = o2.volume,
o1.count = o2.count;
参见demo。
在 MariaDB 我有这个 table:
OHCL
|------
|Column|Type|Null|Default
|------
|//**id**//|int(3)|No|
|index_minus|int(10)|No|0
|timestamp|int(11)|Yes|NULL
|year|int(4)|Yes|NULL
|month|int(2)|Yes|NULL
|day|int(2)|Yes|NULL
|hour|int(2)|Yes|NULL
|minute|int(2)|Yes|NULL
|close|float|Yes|NULL
|MFA_short|float|Yes|NULL
|MFA_long|float|Yes|NULL
|volume|float|Yes|NULL
|count|int(10)|Yes|NULL
== Dumping data for table OHCL
|1|0|1619743800|2021|4|30|2|50|0.3036|NULL|NULL|97852.6|41
|2|1|1619744100|2021|4|30|2|55|0.30358|NULL|NULL|221278|45
|3|2|1619744400|2021|4|30|3|0|0.303548|NULL|NULL|41685|30
|4|3|1619744700|2021|4|30|3|5|0.304009|NULL|NULL|158091|23
我需要将 id
和 index_minus
以外的每一行“移动”(或移动?不确定哪个术语最能说明这一点)向上移动 1,因此丢弃 id = 1 的行。行720 应填充默认值。最后一行中的默认值并不那么重要。我将在下一步中用新数据更新这一行。我只是想,如果这完全可能的话,那么默认值就是可行的方法。
结果应该是这样的:
|1|0|1619744100|2021|4|30|2|55|0.30358|NULL|NULL|221278|45
|2|1|1619744400|2021|4|30|3|0|0.303548|NULL|NULL|41685|30
|3|2|1619744700|2021|4|30|3|5|0.304009|NULL|NULL|158091|23
|4|3|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL
我试了一段时间了,但不知道这是否可行?
试图只移动一个列进行测试,我得到的最接近的是这样的:
UPDATE OHCL SET minute = LEAD(minute) OVER (ORDER BY id) AS minute
但这没有用。
我是 SQL 的新手。这甚至可以通过单个命令实现吗?
使用LAG()
window 函数获取每行的前id
并连接到table 以更新行:
UPDATE OHCL o
LEFT JOIN (
SELECT *, LAG(id) OVER (ORDER BY id) prev_id
FROM OHCL
) t ON t.prev_id = o.id
SET o.timestamp = t.timestamp,
o.year = t.year,
o.month = t.month,
o.day = t.day,
o.hour = t.hour,
o.minute = t.minute,
o.close = t.close,
o.MFA_short = t.MFA_short,
o.MFA_long = t.MFA_long,
o.volume = t.volume,
o.count = t.count;
查看demo。
如果 id
之间没有间隙,使用自连接会更容易:
UPDATE OHCL o1
LEFT JOIN OHCL o2
ON o2.id = o1.id + 1
SET o1.timestamp = o2.timestamp,
o1.year = o2.year,
o1.month = o2.month,
o1.day = o2.day,
o1.hour = o2.hour,
o1.minute = o2.minute,
o1.close = o2.close,
o1.MFA_short = o2.MFA_short,
o1.MFA_long = o2.MFA_long,
o1.volume = o2.volume,
o1.count = o2.count;
参见demo。