8

私は MySQL を初めて使用するので、この質問はばかげているかもしれません。連続する行の違いを見つけるにはどうすればよいですか?
例:
テーブル (tableName='Abc') には、次のように単一の行が含まれています。

|DATA|
|10  |
|20  |
|30  |
|40  |
|50  |

ここで、出力を次のように取得します。

|Dif|
|10 |
|10 |
|10 |
|10 |

インデックス (primary または Auto_increment) なしでこのような違いを見つける方法は?

4

3 に答える 3

9

自己結合は、連続する行を比較する 1 つの方法です。

SELECT
    MIN(T2.DATA - T1.DATA) AS Dif
FROM
    Abc T1 INNER JOIN Abc T2 on T1.DATA < T2.DATA
ORDER BY
    T1.DATA
于 2012-03-14T06:20:29.043 に答える
7

ユーザー定義変数を使用します。

SET @prevValue:=0;
SELECT value-@prevValue AS diff,@prevValue:=value FROM t;

ケースの最初の行を破棄する必要があります。

テーブルにvalueとフィールドの両方が含まれている場合は、次のようにフィールドをdiff設定できます。diff

SET @prevValue:=0;
UPDATE t SET diff=IF((@d:=value-@prevValue) AND (@prevValue:=value),@d,@d);

を使用することが、変数の設定更新の両方IFを行うことができる唯一の方法です。diff @prevValue

于 2013-08-09T18:12:06.643 に答える
4

前の行を追跡して、DB の外でこれを行うのが最善です。ここにいくつかのコードがあります(うまくいけば、私のphpはあまり錆びていません):

<?php

$prevNum = 0;

$db = mysql_connect(...); // fill in connection string

mysql_select_db("my_db", $db);

$result = mysql_query("select DATA from Abc order by DATA");

while ($row = mysql_fetch_array($result)) {

    $diff = $row[0] - $prevNum;

    echo "$diff\n";

    $prevNum = $row[0];

}

?>

何らかの理由でデータベース内でそれを行う必要がある場合は、基本的に同じことを行うストアド プロシージャを作成するのがおそらく最善でしょう。値 0 で変数をインスタンス化し、各行とその変数の違いを報告してから、設定します変数を行の値に。

John Pick が指摘したように、order by 句を追加するように編集

于 2012-03-14T06:17:53.020 に答える