如何从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)
那么任何人都可以帮我找到解决这个问题的最佳解决方案吗?
这个应该适用于两个数据库:
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)
归档时间: |
|
查看次数: |
24113 次 |
最近记录: |