2012-09-04 60 views
2

我有這樣的表(簡化的):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. value s丟失tick s增加/減少相等的步驟從先前存在的滴答到下一個現有滴答。作爲psudo配方:
    increment = (next_value - current_value)/(next_tick - current_tick)

如何管理呢?

+0

您的環境是什麼?純SQL解決方案可能比涉及其他層的解決方案要多得多。 –

+0

我知道,但我必須使用SQL來執行此操作。我正在使用Java,但這將是第二個計劃。 – mmdemirbas

回答

3

這個存儲過程會做你想要什麼,填充表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 

在指示的位置添加初始滴答和值,如果沒有滴答= 1的行,則需要它們。

+0

非常感謝。似乎工作。我現在想明白:)我會適應這個原始問題。 – mmdemirbas

+0

讓我知道,如果你遇到了麻煩 –

+0

唯一的問題是'ticks'表的名稱可以改變從呼叫到呼叫。可以將名稱作爲參數傳遞:'tickster('ticks_table_1')'? – mmdemirbas

0

首先創建一個編號表

Create Table ALL_NUMBERS (
    N Integer 
) 

Alter table ALL_NUMBERS add primary key (n); 

然後從1補數表,大一些,像100萬

後左加入您的數據表這個數字表並填寫差距..

+0

感謝您的回覆。加入一個完整的tick集合是一種很好的方法。如何填補空白,如何這樣的查詢呢?順便說一句,從'min(tick)'到'max(tick)'(我的例子中爲1到10)就足夠了。 – mmdemirbas

+0

我將在今晚晚些時候寫出查詢。我沒有方便的數據庫。如果您需要提示,請使用類似臨時變量的東西,並繼續檢查您的滴答滴答差距。 –