2009-04-12 71 views
4

如果我们有一个表称为随访和具有行[ID(INT),值(金钱)] ,我们有在它的一些行,例如
ID --Value
1 ------ 70
2 ------ 100
3 ------ 150
8 ------ 200
20 ----- 250
45 ----- 280
并且我们想让一个SQL查询得到每个行ID,Value和前面的行值,其中数据显示如下
ID ---值--- Prev_Value
1 ----- 70 ---------- 0
2 ----- 100 -------- 70
3 ----- 150 -------- 100
8 ----- 200 -------- 150
20 ---- 250 -------- 200
45 ---- 280 -------- 250
如何从SELECT语句的前一个结果行中获取值?

我提出以下查询,但我觉得它是如此糟糕的表现在大数据量的

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

你会指定RDBMS吗? – Sung 2009-04-12 19:34:56

+0

对不起,我忘了指定我的RDBMS 我使用Access 2007 – 2009-04-13 08:38:11

+0

http://stackoverflow.com/questions/1062406 很多的这些问题... – colithium 2009-07-01 08:03:55

回答

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

如何将线条拉入应用程序并计算以前的值?

-1

创建存储过程并使用游标来迭代和生成行。

+0

存储过程中Access 2007? – 2009-04-14 20:23:12

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

这不是您的实际问题的答案。

相反,我觉得你正在从一个错误的方向接近问题: 在正常规范化的关系数据库中,每个表的元组(“行”)应该包含对其他数据项的引用,而不是实际值。维护元组之间的这些关系属于代码库的数据插入部分。 也就是说,如果包含最接近的元组的值,则较小的id号实际上属于您的数据模型。

如果知道前一个值的需求来自应用程序的视图部分 - 也就是需要以某种方式格式化数据的单个视图 - 您应该将内容拉出,按id排序,并处理查看特定代码的要求。

在你的情况,我会假设知道前面的元组的值真的属于视图代码而不是数据库。

编辑:你确实提到你将它们分开存储,只是想为它做一个查询。即使如此,应用程序代码可能会更合乎逻辑地进行这种组合。

-1

您可以使用功能“LAG”。

 SELECT ID, 
      Value, 
      LAG(value) OVER(ORDER BY ID) AS Prev_Value 
    FROM FOLLOWUP; 
相关问题