Office中国论坛/Access中国论坛

标题: [讨论][分享]求下一条记录与上一条记录的差值 [打印本页]

作者: sgrshh29    时间: 2005-12-31 01:09
标题: [讨论][分享]求下一条记录与上一条记录的差值
求某个字段下一条记录与上一条记录的差值.请诸位评评理,查询居然可以这样用.还有更简单的方法吗?[attach]15092[/attach]
其中查询1是升序的,查询2是降序的.查询3是wuaza大侠提供的代码,

[此贴子已经被作者于2005-12-31 17:40:05编辑过]


作者: wu8313    时间: 2005-12-31 01:21
谢谢分享技巧。

这个方法很好,个人感觉有一点局限性,如果id 按照降序排列的话,就无法得到正确的结果。

当然比使用dao或者ado在列中向下循环,然后取值,求差值要方便很多.


作者: sgrshh29    时间: 2005-12-31 01:23
如果按降序排列,只要把那个<改为>就可以了.请看顶楼新增加的查询2.

[此贴子已经被作者于2005-12-31 5:34:08编辑过]


作者: wuaza    时间: 2005-12-31 02:30
数据多的话,我这个明显要快。

select id,金额,金额 as 差额 from 表1 where id =1
union
SELECT a.id,a.金额,min (a.金额-b.金额 ) as 差额 from 表1 as a,表1 as b where b.id < a.id group by a.id,a.金额 ;

如果id按降序排列,只要把"<"改为">"就可以了。

[此贴子已经被作者于2005-12-30 18:40:20编辑过]


作者: sgrshh29    时间: 2005-12-31 02:58
感谢!速度确实很快,但是有点小问题.请再想想办法.


[此贴子已经被作者于2005-12-30 18:59:14编辑过]


作者: wuaza    时间: 2005-12-31 04:57
select id,金额,金额 as 差额 from 表1 where id =1
union
SELECT a.id,a.金额,(a.金额-b.金额 ) as 差额 from 表1 as a,表1 as b where b.id = dmax("id","表1","id<" & a.id )
作者: sgrshh29    时间: 2005-12-31 13:33
以下是引用wuaza在2005-12-30 20:57:00的发言:
select id,金额,金额 as 差额 from 表1 where id =1
union
SELECT a.id,a.金额,(a.金额-b.金额 ) as 差额 from 表1 as a,表1 as b where b.id = dmax("id","表1","id<" & a.id )

数据200条,等的心焦,增加到500条,几乎宕机.
作者: wu8313    时间: 2006-1-1 01:16
以下是引用sgrshh29在2005-12-31 5:33:00的发言:



数据200条,等的心焦,增加到500条,几乎宕机.

很多时候,我都着急 自己查询写不出来,更没有想到 查询效率 的问题。还是sgrshh29 想得周到。
作者: sgrshh29    时间: 2006-1-1 01:38
要照顾到效率问题,就不能用楼主的方法来查询,改变一下思路,不求最简,只求最快,运行里面的宏就可以比较出来了.[attach]15103[/attach]


[此贴子已经被作者于2005-12-31 18:57:19编辑过]


作者: wu8313    时间: 2006-1-1 02:52
以下是引用sgrshh29在2005-12-31 17:38:00的发言:
要照顾到效率问题,就不能用楼主的方法来查询,改变一下思路,不求最简,只求最快,运行里面的宏就可以比较出来了.[attach]15102[/attach]

版本高了,没法看。谢谢 sgrshh29 分享!
作者: sgrshh29    时间: 2006-1-1 02:59
以下是引用wu8313在2005-12-31 18:52:00的发言:



版本高了,没法看。谢谢 sgrshh29 分享!

感谢您的提醒.9楼已经改为2000版本.
作者: 情比金坚    时间: 2006-1-1 23:23
SELECT 表1.id, 表1.金额, DLookUp("金额","表1","id>" & [id])-[金额] AS 差额
FROM 表1;

这样算一霎那就出来了,怎么会说慢呢?域函数是效率很高的函数啊?
作者: sgrshh29    时间: 2006-1-1 23:33
情版主可能忽略了一个细节,id是自动编号,如果删除了其中的某些记录,就不连号了.这样在断号的记录之间的差值就会发生错误.
作者: 情比金坚    时间: 2006-1-1 23:36
还是我错了:改一下:这样的结果就和你的一致了,嘿嘿,连不连号没关系,顺序就行.

SELECT 表1.id, 表1.金额, [金额]-DLast("金额","表1","id<" & [id]) AS 差额
FROM 表1;


[此贴子已经被作者于2006-1-1 15:51:47编辑过]


作者: sgrshh29    时间: 2006-1-2 00:12
以下是引用情比金坚在2006-1-1 15:36:00的发言:


还是我错了:改一下:这样的结果就和你的一致了,嘿嘿,连不连号没关系,顺序就行.

SELECT 表1.id, 表1.金额, [金额]-DLast("金额","表1","id<" & [id]) AS 差额
FROM 表1;

这个可能是最好的方法了,佩服.最好加上ORDER BY 表1.ID;

[此贴子已经被作者于2006-1-1 16:14:34编辑过]


作者: wuaza    时间: 2006-1-2 05:35
我前面几个献丑了,大伙不要试,机器会算死的。呵呵~~

再来一个,速度稍好,但与情比金坚的没法比。

SELECT a.id, a.金额, a.金额-nz((select 金额 from 表1 where id=(select max(id) from 表1 where id<a.id)),0) AS 差额
FROM 表1 AS a;
作者: fan0217    时间: 2006-1-2 05:50
我觉得使用dao或者ado方法可能更好一些。
作者: king863    时间: 2006-1-2 10:12
ding
作者: king863    时间: 2006-1-2 10:15
ding




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3