MySql - 为跳过的数字插入行(插值)

标签 mysql

我有一个这样的表(简化版):

+------+--------+
| tick | value  |
+------+--------+
|    1 |     10 |
|    2 |     20 |
|    5 |     50 |
|    7 |     10 |
|   10 |     85 |
+------+--------+

我想生成另一个表,其中包括从min(tick)max(tick)的所有数字作为刻度值:

+------+--------+
| tick | value  |
+------+--------+
|    1 |     10 |           * already exists
|    2 |     20 |           * already exists
|    3 |     30 | = 20 + 10
|    4 |     40 | = 30 + 10
|    5 |     50 | = 40 + 10 * already exists
|    6 |     30 | = 50 - 20
|    7 |     10 | = 30 - 10 * already exists
|    8 |     35 | = 10 + 25
|    9 |     60 | = 35 + 25
|   10 |     85 | = 60 + 25 * already exists
+------+--------+

要清楚,

  1. 我有不连续刻度值,想插入缺失的刻度。
  2. 我想对另一个表执行此操作,因此不会修改原始表。
  3. 缺失的tick从上一个现有的tick 到下一个现有的tick 随着相等的步数增加/减少。作为伪公式:
    increment = (next_value - current_value)/(next_tick - current_tick)

如何管理这个?

最佳答案

此存储过程将执行您想要的操作,填充表allticks

CREATE PROCEDURE `tickster`()
BEGIN
    DECLARE finished INT DEFAULT 0;
    DECLARE oldticks INT DEFAULT 0; -- initial ticks here
    DECLARE oldvalue INT DEFAULT 0; -- initial value here
    DECLARE newticks INT DEFAULT 0;
    DECLARE newvalue INT DEFAULT 0;
    DECLARE t INT DEFAULT 0;
    DECLARE v INT DEFAULT 0;
    DECLARE delta INT DEFAULT 0;

    DECLARE existing CURSOR FOR SELECT ticks,value FROM ticks ORDER BY ticks;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished=1;

    OPEN existing;

    nexttick: LOOP
        -- Get next value or break
        FETCH existing INTO newticks,newvalue;
        IF finished>0 THEN
            LEAVE nexttick;
        END IF;

        -- initialize a loop to cover the inexistant ticks
        SET t=oldticks+1;
        SET v=oldvalue;
        SET delta=(newvalue-oldvalue)/(newticks-oldticks);

        -- run the loop
        nextstep: LOOP
            IF t>=newticks THEN
                LEAVE nextstep;
            END IF;
            -- calculate new interpolated value and write it to the table
            SET v=v+delta;
            INSERT INTO allticks SET ticks=t, value=v;
            SET t=t+1;
        END LOOP;

        -- write the existing value to the table
        INSERT INTO allticks SET ticks=newticks, value=newvalue;

        -- make new dataset the old dataset
        SET oldticks=newticks;
        SET oldvalue=newvalue;

    END LOOP;
END

如果没有 ticks=1 的行,则在需要的地方添加初始刻度和值

关于MySql - 为跳过的数字插入行(插值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12264892/

相关文章:

MYSQL 两表排序 TRICKY

php - 关于为什么在 PHP 游戏中无法获得积分的建议

php - 使用 PDO 检查表是否存在

php - Linux下php无法获取数据

php - PDO::last Insert Id 总是返回 0 与 MYSQL 和 prepare 语句一起使用

mysql - mysql 中列值的增量更新。并发问题?

mysql - 这可以在一个快速的 mysql 查询中实现吗?

php 版本的 mysql str_to_date()

MySQL 使用来自同一个表的值更新表

php - 如何在选择查询中使用多个表?(没有内部联接)