2017-01-28 4 views
-4

私のデータを二列の差分を取得し、差分mysqlの上で数学演算を実行することは、私は同じIDの二つの連続する要素間の違いを見つけて、値を格納する必要があり、この例えば設定

ID|Value 
1|10 
1|3 
2|9 
2|10 
2|15 

のように見えますその差異を再度見つけて、同じ差異を持つ値のすべてを新しい差異で累積します。これは同じIDの要素があるまで続く必要があります。 したがって、私の最終的なデータセットは、誰もが、私は、これは、連続する行の間の差異の計算SQL

+1

SQLテーブルは*順不同*セットを表します。したがって、順序を指定する列がない限り、「2つの連続した[行]」というようなものはありません。私はそのようなコラムを見ません。 –

+0

id 2の '-5'はどこから来ますか? – Barmar

+0

@Barmar申し訳ありません5 –

答えて

0

を使用して行くべきか何か提案していない

ID|Value 
1|-7 
2|5 

をlooklikeべきではない -

MariaDB [sandbox]> SELECT T.*, 
    -> IF(T.TID <> @P ,@RN:=1,@RN:[email protected]+1) RN, 
    -> IF(T.TID <> @P ,0, @PVAL) PVAL, 
    -> IF(T.TID <> @P ,0, T.VALUE * 1.00 - @PVAL) DIFF, 
    -> @P:=T.TID, 
    -> @PVAL:=T.VALUE 
    -> FROM(SELECT @RN:=0,@P:=0,@PVAL:=0.00,@DIFF:=0.00) RN,T 
    -> ORDER BY T.TID,T.dt; 
+------------+------+-------+------+------+------+-----------+----------------+ 
| dt   | TID | Value | RN | PVAL | DIFF | @P:=T.TID | @PVAL:=T.VALUE | 
+------------+------+-------+------+------+------+-----------+----------------+ 
| 2017-01-01 | 1 | 10 | 1 | 0 | 0 |   1 |    10 | 
| 2017-01-02 | 1 |  3 | 2 | 10 | -7 |   1 |    3 | 
| 2017-01-01 | 2 |  9 | 1 | 0 | 0 |   2 |    9 | 
| 2017-01-02 | 2 | 10 | 2 | 9 | 1 |   2 |    10 | 
| 2017-01-03 | 2 | 15 | 3 | 10 | 5 |   2 |    15 | 
+------------+------+-------+------+------+------+-----------+----------------+ 
5 rows in set (0.00 sec) 

をしかし、誰がありますSQLの集計関数(私が知る限り、どのバージョンでも)は、差異の製品を計算します(正しい場合)。あなたはすべてのtidの最初の行を破棄したいと思うほどです。 これを行うには、テーブルの相違をgroup_concatenatingしてから、動的SQL(動的ストアド・ファンクションで動的SQLを使用することはできません)の呼び出しを開始するストアド・プロシージャを呼び出します。

このスクリプトで呼ばれるこのストアドプロシージャ

drop procedure if exists f; 
delimiter // 

CREATE DEFINER=`root`@`localhost` procedure `F`(
    instring varchar(200) 
) 

LANGUAGE SQL 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT '' 
begin 
declare tempstring varchar(100); 
declare outstring varchar(100); 
declare tempid int; 
declare checkit int; 
declare maxrecs int; 
set checkit = 0; 
set maxrecs = (select count(*) from temp); 

looper: while checkit < maxrecs do 
select tid,calc into tempid,tempstring from temp limit checkit,1; 
set checkit = checkit + 1; 
if instr(tempstring,',') = 0 then 
    update temp 
    set rsult = tempstring; 
else 
    set outstring = replace(tempstring,',','*'); 
    set outstring = concat('update temp set rsult = (Select ',outstring,') where tid = ', tempid, ';'); 
    set @sqlstmt = outstring; 
    #select checkit, maxrecs, outstring; 
    prepare sqlstmt from @sqlstmt; 
    execute sqlstmt; 
    deallocate prepare sqlstmt; 
end if; 

end while; 
end // 

delimiter ; 

があなたの望ましい結果を生成

*ariaDB [sandbox]> drop table if exists temp; 
Query OK, 0 rows affected (0.09 sec) 

MariaDB [sandbox]> create table temp as 
    -> select s.tid,group_concat(s.diff) calc, 1.00 as rsult 
    -> from 
    -> (
    -> SELECT T.*, 
    -> IF(T.TID <> @P ,@RN:=1,@RN:[email protected]+1) RN, 
    -> IF(T.TID <> @P ,0, @PVAL) PVAL, 
    -> IF(T.TID <> @P ,0, T.VALUE * 1.00 - @PVAL) DIFF, 
    -> @P:=T.TID, 
    -> @PVAL:=T.VALUE 
    -> FROM(SELECT @RN:=0,@P:=0,@PVAL:=0.00,@DIFF:=0.00) RN,T 
    -> ORDER BY T.TID,T.dt 
    ->) s 
    -> where s.rn <> 1 
    -> group by s.tid; 
Query OK, 2 rows affected (0.23 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

MariaDB [sandbox]> 
MariaDB [sandbox]> 
MariaDB [sandbox]> call f('1'); 
Query OK, 0 rows affected (0.07 sec) 

MariaDB [sandbox]> 
MariaDB [sandbox]> select * from temp; 
+------+-----------+-------+ 
| tid | calc  | rsult | 
+------+-----------+-------+ 
| 1 | -7.00  | -7.00 | 
| 2 | 1.00,5.00 | 5.00 | 
+------+-----------+-------+ 
2 rows in set (0.00 sec)*