回 帖 发 新 帖 刷新版面

主题:一堆杂乱无章的数,如何统计出现的次数,代码应如何写呢,请高手支招

DBF表----A1
-----------------------------------------------------------------
表名  |  参数
P0001 |   29,24,35,02,34,20,31,36,10,09,25,14,28,01,26,23,15,33,
P0002 |   08,19,20,11,01,02,35,03,16,23,27,34,32,29,25,30,12,22,
P0003 |   26,21,11,22,16,24,12,27,33,13,15,18,04,05,19,02,03,31,
P0004 |   29,34,32,27,07,16,01,25,08,30,22,18,35,23,31,11,06,12,
P0005 |   04,14,05,06,08,21,17,01,36,34,13,22,03,23,33,24,25,30,
......      共有1万条记录     
-----------------------------------------------------------------

现在需要从A1表中取出 多张表(如8张) 来统计各数值出现的次数,代码应如何写呢,请高手支招。

需要的结论如下(举例):
8次: 20
5次:01,12,15
3次:03,04,09,23,29,33,35,36
2次:06,07,11,16,19
1次: …
0次:…

回复列表 (共28个回复)

21 楼

谢谢朋友们。我今天晚上喝醉了,现在才回复,抱歉抱歉!

附件在此(不晓得如何链接)
http://bbs.pfan.cn/downfile.asp?fileid=4825

由于论坛不能上传太大的附件,删除了很多条记录
(参数表共有10万条、记录表中每期相应有10万条,有非常多记录)
最终目的如下(举例):
8次: 20
5次:01,12,15
3次:03,04,09,23,29,33,35,36
2次:06,07,11,16,19
1次: …
0次:…

---------------两表关系-----
m.ncq=174
Select ;
    记录.表名,;
    记录.结果 As 上次结果,;
    参数.参数 ;
    FROM Dbf\参数\记录 LEFT OUTER JOIN dbf\参数\参数 ;
       ON  ALLTRIM(记录.表名) == ALLTRIM(参数.表名);
        where 记录.总期次=m.ncq and 记录.n连>=2;
        INTO Table tmp\A1

合并表记录,统计次数----?

22 楼

[quote]按你给的数据

    CREATE CURSOR Temp(tablename c(10),参数 c(110))
    FOR i = 1 TO 10000
    cStr=''
        FOR n= 1 TO 36
            cStr=cStr+PADL(ALLTRIM(STR(INT(RAND()*35+1))),2,'0')+','
        ENDFOR
        INSERT INTO Temp(tablename,参数) VALUES ('P00'+aLLTRIM(STR(i)),cStr)
    ENDFOR

用直接分组查询我试了一下是  0.8 秒!!![/quote]

用lz的数据测试:
循环:1.248
汇总:1.960

.......

麻烦cbl老师把查询的语句发上来让我们学习下.我的查询怎么就这么慢.

23 楼

create table occNum(数字 C(2),次数 N(6))
use A1 in 0
for i = 1 to 99
  select A1
  c = chrt(str(i,2),' ','0')
  sum occur(c,参数) to Num
  select occNum
  appe blank
  repl 数字 with c, 次数 with Num
endfor
......

24 楼

高老师的速度比我的有所提高,普遍在1秒左右.

25 楼

看起来好像彩票分析,01-36个号码,每次选其中的18个,根据已往数据分析各个号码出现的次数。其实每个号码的出现是等概率的,已往数据越多,每个号码的出现次数越趋同。

就事论事,如果要得到全部已有数据中各个号码出现的次数,何必强求Select-SQL。

DIMENSION array1[36]
array1=0
IF !USED("参数")
   USE LOCFILE("参数.dbf","DBF") IN 0
ENDIF
SELECT 参数
SCAN 
  =ALINES(arraytmp,参数,5,",")
  FOR nI=1 TO 18    
      nP=INT(VAL(arraytmp(nI)))
      array1(nP) = array1(nP) + 1
  ENDFOR
ENDSCAN
FOR nI=1 TO 36    
  ? PADL(TRANSFORM(nI),2,"0")+SPACE(3)+TRANSFORM(array1(nI))+"次"
ENDFOR

26 楼

Ilikefox的在0.33秒左右.
高啊.还有更快的不?

27 楼

Ilikefox的代码,确实高.速度非常快! 就这几行代码,够我学习消化一段时间了。敬仰中....

28 楼


耐思尼克祝大家圣诞新春快乐!
建站宝盒"零"费用帮您建站,免费提供上百套模板!免费帮您发布产品供求信息!

帮您做推广!是首选的智能建站工具!企业建站的核心助手!
咨询QQ: 52064595
免费试用网址:  http://www.itnic.cn/design/?s=tongtao

我来回复

您尚未登录,请登录后再回复。点此登录或注册