Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 检索记录';上一列的值_Mysql_Sql_Select_Join_Left Join - Fatal编程技术网

Mysql 检索记录';上一列的值

Mysql 检索记录';上一列的值,mysql,sql,select,join,left-join,Mysql,Sql,Select,Join,Left Join,假设我有这张桌子: |ID|ForeignKey|Number| | 1| A | 5| | 2| B | 3| | 3| A | 2| | 4| B | 5| 我想得到这个输出: |ForeignKey|PrevNumber|CurNumber| | A | 0| 5| | B | 0| 3| | A |

假设我有这张桌子:

|ID|ForeignKey|Number|
| 1|    A     |     5|
| 2|    B     |     3|
| 3|    A     |     2|
| 4|    B     |     5|
我想得到这个输出:

|ForeignKey|PrevNumber|CurNumber|
| A        |         0|        5|
| B        |         0|        3|
| A        |         5|        2|
| B        |         3|        5|
那么,如何检索记录的上一个属性呢? 我尝试过使用不同类型的联接,如left、Internal,但没有效果

SELECT A.ForeignKey, COALESCE(B.Number, 0) AS PrevNumber, A.Number AS CurNumber 
FROM table1 A 
LEFT JOIN table1 B ON A.ForeignKey = B.ForeignKey AND A.ID > B.ID
ORDER BY A.ID
检查

输出

| FOREIGNKEY | PREVNUMBER | CURNUMBER |
|------------|------------|-----------|
|          A |          0 |         5 |
|          B |          0 |         3 |
|          A |          5 |         2 |
|          B |          3 |         5 |
| FOREIGNKEY | PREVNUMBER | CURNUMBER | NEXTNUMBER |
|------------|------------|-----------|------------|
|          A |          0 |         5 |          2 |
|          B |          0 |         3 |          5 |
|          A |          5 |         2 |          0 |
|          B |          3 |         5 |          0 |
FK  Prev    CurNumber
A   0       5
B   0       3
A   5       2
B   3       5
::编辑::

SELECT A.ForeignKey, COALESCE(B.Number, 0) AS PrevNumber, A.Number AS CurNumber, COALESCE(C.Number, 0) AS NextNumber
FROM table1 A 
LEFT JOIN table1 B ON A.ForeignKey = B.ForeignKey AND A.ID > B.ID
LEFT JOIN table1 C ON A.ForeignKey = C.ForeignKey AND A.ID < C.ID
ORDER BY A.ID
试试这个

select d.FK,ISNULL(d.Prev,0) as Prev,d.Num1 as CurNumber from (
select t.Number as Num1,t.ForeignKey as FK,
(select top 1 NUmber from test where ID=t.ID-2) as Prev
   from test t
   )d
输出

| FOREIGNKEY | PREVNUMBER | CURNUMBER |
|------------|------------|-----------|
|          A |          0 |         5 |
|          B |          0 |         3 |
|          A |          5 |         2 |
|          B |          3 |         5 |
| FOREIGNKEY | PREVNUMBER | CURNUMBER | NEXTNUMBER |
|------------|------------|-----------|------------|
|          A |          0 |         5 |          2 |
|          B |          0 |         3 |          5 |
|          A |          5 |         2 |          0 |
|          B |          3 |         5 |          0 |
FK  Prev    CurNumber
A   0       5
B   0       3
A   5       2
B   3       5

我们试图问什么?如何实现第二个表中显示的输出?但是PrevNumber列的逻辑是什么?你从哪里得到PrevNumbers(0,0,5,3)?PrevNumber中的第一个0确定没有A的先前记录,A的下一个实例中的PrevNumber将是A的上一个实例的CurNumber,依此类推…搜索“mysql缺少lag()函数的变通方法”这正是我试图实现的!非常感谢你!