如何选择以前的行价?

Gop*_*pal 3 ms-access

如何从SELECT语句的上一个结果行获取值

如果我们有一个名为cardevent的表并且有行[ID(int),Value(Money)]并且我们有一些行,例如

ID --Value

1------70 
1------90
2------100
2------150
2------300 
3------150 
3------200 
3-----250 
3-----280 
Run Code Online (Sandbox Code Playgroud)

等......

如何创建一个查询,获取每个行ID,值和上一个行值,其中数据显示如下

ID --- Value ---Prev_Value

1 ----- 70 ----------  0 
1 ----- 90 ---------- 70
2 ----- 100 --------  90 
2 ------150 -------- 100
2 ------300 -------- 150
3 ----- 150 -------- 300 
3 ----- 200 -------- 150 
3 ---- 250 -------- 200 
3 ---- 280 -------- 250 
Run Code Online (Sandbox Code Playgroud)

等等.

我做了以下查询,但在大量数据中表现如此糟糕

SELECT cardevent.ID, cardevent.Value, 
      (SELECT F1.Value
       FROM cardevent as F1 
       where F1.ID = (SELECT  Max(F2.ID)
                      FROM cardevent as F2 
                      WHERE F2.ID < cardevent.ID)
      ) AS Prev_Value
FROM cardevent
Run Code Online (Sandbox Code Playgroud)

那么任何人都可以帮我找到解决这个问题的最佳解决方案吗?

Mic*_*Sim 6

这个应该适用于两个数据库:

SELECT cardevent.ID, cardevent.Value, 
  (SELECT TOP 1 F1.Value
   FROM cardevent as F1
   WHERE F1.ID < cardevent.ID
   ORDER BY F1.ID DESC
   ) AS Prev_Value
FROM cardevent
Run Code Online (Sandbox Code Playgroud)

更新:假设ID不是唯一的,但ID和Value的组合是唯一的(您必须指定在表上强制排序的内容,因此可以知道前一行是什么),您必须使用此查询:

select cardevent.ID, cardevent.Value, 
    (select TOP 1 F1.Value from cardevent as F1
     where (F1.ID < cardevent.ID) or (F1.ID = cardevent.ID and F1.Value < cardevent.Value)
     order by F1.ID DESC, F1.Value DESC
    ) AS Prev_Value
from cardevent 
Run Code Online (Sandbox Code Playgroud)