Dee*_*ani 8 mysql database-table
由于我是MySQL的新手,这个问题可能很愚蠢.如何找到连续行之间的差异?
示例:
表(tableName ='Abc')包含单行,如下所示,
|DATA|
|10 |
|20 |
|30 |
|40 |
|50 |
Run Code Online (Sandbox Code Playgroud)
在这里,我想得到输出,
|Dif|
|10 |
|10 |
|10 |
|10 |
Run Code Online (Sandbox Code Playgroud)
如何在没有任何索引(primary或Auto_increment)的情况下找到这样的差异?
自联接是比较连续行的一种方法:
SELECT
MIN(T2.DATA - T1.DATA) AS Dif
FROM
Abc T1 INNER JOIN Abc T2 on T1.DATA < T2.DATA
ORDER BY
T1.DATA
Run Code Online (Sandbox Code Playgroud)
使用用户定义的变量:
SET @prevValue:=0;
SELECT value-@prevValue AS diff,@prevValue:=value FROM t;
Run Code Online (Sandbox Code Playgroud)
你必须丢弃你案件的第一行.
如果表中同时包含value和diff字段,可以设置diff字段:
SET @prevValue:=0;
UPDATE t SET diff=IF((@d:=value-@prevValue) AND (@prevValue:=value),@d,@d);
Run Code Online (Sandbox Code Playgroud)
使用IF是我能找到的唯一途径都设定diff 和更新@prevValue变量.
最好通过跟踪前一行来在数据库外部执行此操作。这是一些代码(希望我的 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];
}
?>
Run Code Online (Sandbox Code Playgroud)
如果出于某种原因需要在数据库中执行此操作,那么最好创建一个存储过程,该过程基本上会执行相同的操作:实例化值为 0 的变量,报告每行和该变量的差异,然后设置变量到行值。
编辑以添加 John Pick 指出的 order by 子句
| 归档时间: |
|
| 查看次数: |
10104 次 |
| 最近记录: |