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()函数的变通方法”这正是我试图实现的!非常感谢你!