200分求一SQL算法

antinet 2002-07-25 04:36:24
已知一表中有若干条数据,已某条数据为基点,求前后N条连续的数据,具体解释如下:
假设某表有6条记录,以第4条为基点,求前后范围的N条数据(即N>=5),此时正确的答案应是取前连续3条和后连续2条,可以描述为F+L = N,其中F为往前(小于基点)的数据条数,L为后续记录条数。当数据足够多时,基点实际位于待取N条记录的中间,即N/2取整再加N/2的模。当数据很少时,则取完所有数据,此时F+L<N(N>=5),即F+L<5。
此算法用于工业应用中对连续采样数据中某点丢失时的预测算法,N不会太大,因为此时预测的精度反而会减小,但N>=5
结果可以发至antinet@21cn.com,要求用PB+SQL实现,解决后再给100分
...全文
45 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
guojing590 2003-05-02
  • 打赏
  • 举报
回复
太复杂了!
zhengyao 2003-05-02
  • 打赏
  • 举报
回复
我只说我的想法:你可以设置一个窗子,窗子中有N(你所求取的数据数目)个格子(变量),其中一个为特殊的格子,利用游标提取数据,从头选择游标中的数据N条付给窗子,直到窗子中出现你所期望的数据。
此法相当于窗子在数据中滚动,那条特殊的数据相当于那个特殊的格子。
antinet 2003-05-02
  • 打赏
  • 举报
回复
怎么样?够挑战吧?
antinet 2003-04-30
  • 打赏
  • 举报
回复
这个问题贴出很久了,一直没有人能回答。显然用一条SQL语句是不可能实现的,这谁都看得出,无论是用存储过程还是写成数据库函数,都必须注意递归的问题。提示一下,这是个标准的1元3点不等距插值算法。
WorldMobile 2002-08-28
  • 打赏
  • 举报
回复
你想用一个Sql语句写出来是不是?

这个问题已经提过一次,不知是不是你

用一条SQL语句是不可能的,你需要写一个数据存储,

如果要写数据存储的话,不用我说,你也知道怎么干了
sfb 2002-08-28
  • 打赏
  • 举报
回复
up
msf 2002-08-28
  • 打赏
  • 举报
回复
用数据存储或许可以.
antinet 2002-07-31
  • 打赏
  • 举报
回复
用DW可能不行,此处关键是递归
zzz1975 2002-07-31
  • 打赏
  • 举报
回复
sturday!!
yhbdr 2002-07-29
  • 打赏
  • 举报
回复
Kao
HJZ2970 2002-07-29
  • 打赏
  • 举报
回复
用SQL 实现是否很麻烦?我觉得用 2个 datawindow 实现更容易、维护简单。具体算法如下:
==================================================================
1)创建一个窗口,放 2个datawindow ,dw_1(全部数据)、dw_2(过滤后的数据)
2)dw_1 中读入全部数据
3)设置纪录定位,考虑下面几种情况(假设 p 为基点, n 为读取个数,r w为 dw_1 的 rowcount)
a)p=1 时 li_start =1
li_count = iif(n<r,n,r)
b)p=r 时 li_strat = iif(n>r,1,r+1-n)
li_count = iif(n<r,n,r)
c)其它情况,即基点不在两端时
if n>r then // 提取点比全部数据多
li_start =1;li_count = r ;
else
if p - int(n/2) < 0 then // 提取点前数据不够
li_start =1;li_count = n ;
else
if p + int(n/2) > r then // 提取点后数据不够
li_start = r - n;li_count =n;
else
li_start = p - int(n/2);li_count =n;
end if
end if
end if

4)根据 li_start,li_count 读取数据,并拷贝到 dw_2
for i=li_start to li_count
.....
Next

上述的只是我的思路,若编程还得注意细节
kimcz 2002-07-25
  • 打赏
  • 举报
回复
不知道我想的对不对?
我先做了temp表, 比原先表多了数字形index_no字段,但这个字段是每增加一句,自动加一。如1,2,3,.....n为止。 下面where后面是primary key, 如果一个以上时各个primary key 相加。像这样 CONVERT(Char(10),c.aa_DT,102)+Char(c.aa_qty)+c.item_cd < CONVERT(Char(10),a.aa_DT,102)+Char(a.aa_qty)++a.item_cd

insert into toefl_temp (index_no, error_qty) select (select count(*)+1 from toefl b where b.error_qty < a.error_qty ), a.error_qty from toefl a

然后是从temp表中找出相关的资料,
select * from toefl_temp where index_no between (select count(*)/2 from toefl_temp)-2 and (select count(*)/2 from toefl_temp)+2

以上部分有生成连续数字,但找出相关资料时没有动态性,还有需要查找的数据没有规律时以上部分不太管用。



joss 2002-07-25
  • 打赏
  • 举报
回复
能不能举个通俗一点的例子??
LiuHaisky 2002-07-25
  • 打赏
  • 举报
回复
Decld_A// 假设为已知基准参数
Decld_F,ld_L// 前后条件阀值
Longll_N// 总个数
Longll_F// 前面的个数
Longll_L// 后面的个数

Stringls_sql// 所求得sql语句
Stringls_sql_F,ls_sql_L// 求前、后面记录情况的sql语句

IF ll_N < 5 THEN
Return
END IF

IF Mod(ll_N,2) > 0 THEN
ll_F = (ll_N - 1)/2
ELSE
ll_F = ll_N / 2
END IF
ll_L = ll_N - ll_F
// 下面的语句获取前面的ll_F条记录,如果没有这么多记录则全取出来,符合所提出的要求
ls_sql_F = "Select Top " + String(ll_F) + " 定位条件一 From Table Where " + &
"定位条件一<=" + String(ld_A) + " Order by 定位条件一 ASC "

// 定义动态游标一,获取基准记录前的记录情况
Declare Cur_F Dynamic Cursor For Sqlsa;
Prepare Sqlsa From :ls_sql_F;

Open Dynamic Cur_F;
Execute Immediate :ls_sql_F Using Sqlca;

Fetch Cur_F Into :ld_F;
Close Cur_F;

IF ld_F = 0 THEN
ld_F = ld_A// 若前面没有记录则以基准值为开始条件
END IF

// 下面的语句获取后面的ll_L条记录,如果没有这么多记录则全取出来,也符合所提出的要求
ls_sql_L = "Select Top " + String(ll_L) + " 定位条件一 From Table Where " + &
"定位条件一>" + String(ld_A) + " Order by 定位条件一 DESC "

// 定义动态游标二,获取基准记录后的记录情况
Declare Cur_L Dynamic Cursor For Sqlsa;
Prepare Sqlsa From :ls_sql_L;

Open Dynamic Cur_L;
Execute Immediate :ls_sql_L Using Sqlca;

Fetch Cur_L Into :ld_L;
Close Cur_L;

IF ld_L = 0 THEN
ld_L = ld_A// 若前面没有记录则以基准值为开始条件
END IF

IF ld_F = ld_L THEN
messagebox("警告!", "无法获取该基准值附近的连续记录!" )
Return
END IF

ls_sql = "Select 所需字段 From Table Where 定位条件一>=" + String(ld_F) + &
" And 定位条件一<=" + String(ld_L)

====================================

我的额前飞扬着刘海
只因为我就是刘海
云游四海的刘海
戏金蟾的刘海
kimcz 2002-07-25
  • 打赏
  • 举报
回复
我喜欢
pbworm 2002-07-25
  • 打赏
  • 举报
回复
如果是oracle不难,使用rownum可以直接定位,但是如果是sql server的话就麻烦了
pbworm 2002-07-25
  • 打赏
  • 举报
回复
什么数据库?
qlzgdzfl 2002-07-25
  • 打赏
  • 举报
回复
看不懂

海洋‘s 2002-07-25
  • 打赏
  • 举报
回复
这个算法很经典,不过,我看了你的问题头都晕了。等我看看啊,写好了发给你
balloonman2002 2002-07-25
  • 打赏
  • 举报
回复
果然发粪涂墙,这么长的要求看了都头晕,:)

1,108

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧