如果我们有一个名为FollowUp的表并且有行[ID(int),Value(Money)]
我们在其中有一些行,例如
ID - 值
1 ------ 70
2 ------ 100
3 ------ 150
8 ------ 200
20 ----- 250
45 ----- 280
我们希望制作一个SQL查询,以获取每个行ID,值和上一行值,其中数据显示如下
ID ---值--- Prev_Value
1 ----- 70 ---------- 0
2 ----- 100 -------- 70
3 ----- 150 -------- 100
8 ----- 200 -------- 150
20 ---- 250 -------- 200
45 ---- 280 -------- 250
我做了以下查询,但我认为在大量数据中表现如此糟糕
SELECT FollowUp.ID, FollowUp.Value,
(
SELECT F1.Value
FROM FollowUp as F1 where
F1.ID =
(
SELECT Max(F2.ID)
FROM FollowUp as F2 where F2.ID < FollowUp.ID
)
) AS Prev_Value
FROM FollowUp
那么有人可以帮我找到解决这个问题的最佳方案吗?
答案 0 :(得分:4)
这个sql应该比你上面的那个更好,虽然这些类型的查询往往会有一点性能密集...所以你可以放在它们中限制你正在看的数据集的大小将有助于极大。例如,如果您要查看特定的日期范围,请将其放入。
SELECT followup.value,
( SELECT TOP 1 f1.VALUE
FROM followup as f1
WHERE f1.id<followup.id
ORDER BY f1.id DESC
) AS Prev_Value
FROM followup
HTH
答案 1 :(得分:3)
您可以使用OVER语句生成增长良好的行号。
select
rownr = row_number() over (order by id)
, value
from your_table
使用这些数字,您可以轻松查找上一行:
with numbered_rows
as (
select
rownr = row_number() over (order by id)
, value
from your_table
)
select
cur.value
, IsNull(prev.value,0)
from numbered_rows cur
left join numbered_rows prev on cur.rownr = prev.rownr + 1
希望这很有用。
答案 2 :(得分:2)
这不是您实际问题的答案。
相反,我觉得你正在从错误的方向接近问题: 在正确规范化的关系数据库中,每个表的元组(“行”)应包含对其他数据库项的引用,而不是实际值。维护元组之间的这些关系属于代码库的数据插入部分。 也就是说,如果包含具有最接近,较小的id号的元组的值确实属于您的数据模型。
如果知道前一个值的要求来自应用程序的视图部分 - 也就是说,需要以某种方式对其进行格式化的数据的单个视图 - 您应该将内容拉出来,按ID排序,并且在视图特定代码中处理需求。
在你的情况下,我认为知道前面的元组值真的会属于视图代码而不是数据库。
编辑:你确实提到你将它们分开存储,只是想对它进行查询。即便如此,应用程序代码可能是更合理的组合方式。答案 3 :(得分:-1)
如何将线条拉入应用程序并计算之前的值?
答案 4 :(得分:-1)
创建存储过程并使用游标迭代并生成行。
答案 5 :(得分:-1)
您可以使用“LAG”功能。
SELECT ID,
Value,
LAG(value) OVER(ORDER BY ID) AS Prev_Value
FROM FOLLOWUP;