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

时间:2009-04-12 19:02:13

标签: sql ms-access

如果我们有一个名为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

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

6 个答案:

答案 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;