注册 登录
编程论坛 VFP论坛

求连续出现的最大值

fdqzy 发布于 2021-06-25 10:23, 3094 次点击
如表:
只有本站会员才能查看附件,请 登录

条件:
1、对连续出现“M1ZR”的个数统计,
2、对连续出现个数在前10行中(含第10行)进行比较,连续出现数为最大值时,在对应的字段"m1zrmax"标注 “M1ZRMAX”
如表中第10、14、24、32、42行.
谢谢!


[此贴子已经被作者于2021-6-25 10:47编辑过]

21 回复
#2
wengjl2021-06-25 14:00
为什么2和5...不用记录下来?
#3
吹水佬2021-06-25 14:03
全部记录都是“M1ZR”时怎样标注“M1ZRMAX”
#4
吹水佬2021-06-25 14:49
从提供的数据猜想按每10条记录一组统计
程序代码:
DIMENSION arr[1]
ar = 0
n = 0
m = 0
nMax = 0
USE bmax
BLANK FIELDS m1zrmax ALL
SCAN
    IF ALLTRIM(m1zr)=="M1ZR"
        m = m +1
        IF m > nMax
            nMax = m
            n = RECNO()
        ENDIF
    ELSE
        m = 0
    ENDIF
    IF RECNO()%10==0 AND n>0
        ar = ar + 1
        DIMENSION arr[ar]  
        arr[ar] = n
        n = 0
        m = 0
        nMax = 0
    ENDIF
ENDSCAN
IF n > 0
    ar = ar + 1
    DIMENSION arr[ar]  
    arr[ar] = n
ENDIF
FOR i=1 TO ALEN(arr)
    GO arr[i]
    REPLACE m1zrmax WITH "M1ZRMAX"
ENDFOR
SELECT * FROM bmax

#5
fdqzy2021-06-25 14:56
以下是引用吹水佬在2021-6-25 14:03:51的发言:

全部记录都是“M1ZR”时怎样标注“M1ZRMAX”

1、首先是统计连续出现的数;
2、再每10行比较一次,第1次比较1-10行,第2次比较2-11行……。
3、标注时,当第10行的字段m1zr不为空时标注,否则不标注,类推;
可能此表结构有问题,以下表为准。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-6-25 15:10编辑过]

#6
吹水佬2021-06-25 14:58
回复 5楼 fdqzy
我猜错了
#7
fdqzy2021-06-25 15:00
以下是引用吹水佬在2021-6-25 14:49:52的发言:

从提供的数据猜想按每10条记录一组统计
DIMENSION arr[1]
ar = 0
n = 0
m = 0
nMax = 0
USE bmax
BLANK FIELDS m1zrmax ALL
SCAN
    IF ALLTRIM(m1zr)=="M1ZR"
        m = m +1
        IF m > nMax
            nMax = m
            n = RECNO()
        ENDIF
    ELSE
        m = 0
    ENDIF
    IF RECNO()%10==0 AND n>0
        ar = ar + 1
        DIMENSION arr[ar]  
        arr[ar] = n
        n = 0
        m = 0
        nMax = 0
    ENDIF
ENDSCAN
IF n > 0
    ar = ar + 1
    DIMENSION arr[ar]  
    arr[ar] = n
ENDIF
FOR i=1 TO ALEN(arr)
    GO arr[i]
    REPLACE m1zrmax WITH "M1ZRMAX"
ENDFOR
SELECT * FROM bmax

谢谢!
但最后一条记录无标注。

[此贴子已经被作者于2021-6-25 15:09编辑过]

#8
fdqzy2021-06-25 15:05
给你添麻烦了!


[此贴子已经被作者于2021-6-25 15:13编辑过]

#9
fdqzy2021-06-25 15:26
应该是这个结果:
只有本站会员才能查看附件,请 登录

第10行开始,1-10比较;2-11行比较;3-12行比较.......
不需要在字段m1zR不为空时才标,只要在10、11、12.……行都注明前10行连续出现的最大值也行

[此贴子已经被作者于2021-6-25 15:39编辑过]

#10
fdqzy2021-06-25 15:47
版主,就在10行开始,在每行都注明前10行连续出现的最大值
如下表:
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-6-25 15:48编辑过]

#11
吹水佬2021-06-25 16:06
还是有点不明
看看第14行记录
从12--21 是统计结果 3
只有本站会员才能查看附件,请 登录

从13--22 是统计结果 2
只有本站会员才能查看附件,请 登录

第14行记录到底取3还是2
#12
fdqzy2021-06-25 16:41
以下是引用吹水佬在2021-6-25 16:06:12的发言:

还是有点不明
看看第14行记录
从12--21 是统计结果 3

从13--22 是统计结果 2

第14行记录到底取3还是2

是这样,它是这10行的连续出现的结果,与10行外的连续次数无关
#13
fdqzy2021-06-25 16:43
以下是引用吹水佬在2021-6-25 16:06:12的发言:

还是有点不明
看看第14行记录
从12--21 是统计结果 3

从13--22 是统计结果 2

第14行记录到底取3还是2


按包含14行的前10行计,应该是取3,22行取2是对的
这个对最后的应用无关系

[此贴子已经被作者于2021-6-25 16:48编辑过]

#14
fdqzy2021-06-25 16:47
有劳版主了!!!
#15
吹水佬2021-06-25 18:20
还有这种情况:31、32行和41、42行
只有本站会员才能查看附件,请 登录

程序代码:
USE bmax
BLANK FIELDS m1zrmax ALL
FOR nRec=1 TO RECCOUNT() &&-10
    n = 0
    m = 0
    nMax = 0
    GO nRec
    SCAN NEXT 10
        IF ALLTRIM(m1zr)=="M1ZR"
            m = m + 1
            IF m > nMax
                nMax = m
                n = RECNO()
            ENDIF
        ELSE
            m = 0
        ENDIF
    ENDSCAN
    IF n > 0
        GO n
        IF nMax > VAL(m1zrmax)
            REPLACE m1zrmax WITH TRANSFORM(nMax)
        ENDIF
    ENDIF
ENDFOR
SELECT * FROM bmax
#16
fdqzy2021-06-25 19:29
以下是引用吹水佬在2021-6-25 18:20:34的发言:

还有这种情况:31、32行和41、42行

USE bmax
BLANK FIELDS m1zrmax ALL
FOR nRec=1 TO RECCOUNT() &&-10
    n = 0
    m = 0
    nMax = 0
    GO nRec
    SCAN NEXT 10
        IF ALLTRIM(m1zr)=="M1ZR"
            m = m + 1
            IF m > nMax
                nMax = m
                n = RECNO()
            ENDIF
        ELSE
            m = 0
        ENDIF
    ENDSCAN
    IF n > 0
        GO n
        IF nMax > VAL(m1zrmax)
            REPLACE m1zrmax WITH TRANSFORM(nMax)
        ENDIF
    ENDIF
ENDFOR
SELECT * FROM bmax

不要紧,这是上10行和下10行所致,像这种情况多。
谢谢!
#17
fdqzy2021-06-26 11:48
以下是引用吹水佬在2021-6-25 18:20:34的发言:

还有这种情况:31、32行和41、42行

USE bmax
BLANK FIELDS m1zrmax ALL
FOR nRec=1 TO RECCOUNT() &&-10
    n = 0
    m = 0
    nMax = 0
    GO nRec
    SCAN NEXT 10
        IF ALLTRIM(m1zr)=="M1ZR"
            m = m + 1
            IF m > nMax
                nMax = m
                n = RECNO()
            ENDIF
        ELSE
            m = 0
        ENDIF
    ENDSCAN
    IF n > 0
        GO n
        IF nMax > VAL(m1zrmax)
            REPLACE m1zrmax WITH TRANSFORM(nMax)
        ENDIF
    ENDIF
ENDFOR
SELECT * FROM bmax

代码有点不合要求:
1-10行比较,若第10行不为空,最大值标注在第10行;
2-11行比较,若第11行不为空,最大值标注在第11行;
.......
#18
sdta2021-06-26 12:38
以下是引用fdqzy在2021-6-26 11:48:43的发言:


代码有点不合要求:
1-10行比较,若第10行不为空,最大值标注在第10行;
2-11行比较,若第11行不为空,最大值标注在第11行;
.......

楼主过了。

[此贴子已经被作者于2021-6-26 13:34编辑过]

#19
吹水佬2021-06-26 12:58
5楼有提到:“3、标注时,当第10行的字段m1zr不为空时标注,否则不标注,类推;”,只是没说明在哪行标注。
#20
fdqzy2021-06-26 13:36
回复 19楼 吹水佬
是我没表述清楚,对不起!
#21
吹水佬2021-06-26 20:46
不知有无理解错:
1、按记录顺序依次统计连续的10行记录,结果标注在每次的第10行记录。
2、如果某次的第10行不是“M1ZR”则不标注(即忽略这次的数据处理过程),继续下一次的数据处理过程。
程序代码:
USE bmax
BLANK FIELDS m1zrmax ALL
FOR nRec=1 TO RECCOUNT()-9
    GO nRec+9
    IF ALLTRIM(m1zr)!="M1ZR"
        LOOP
    ENDIF
    m = 0
    nMax = 0
    GO nRec
    SCAN NEXT 10
        IF ALLTRIM(m1zr)=="M1ZR"
            m = m + 1
        ELSE
            IF m > nMax
                nMax = m
            ENDIF
            m = 0
        ENDIF
    ENDSCAN
    IF m > nMax
        nMax = m
    ENDIF
    GO nRec+9
    REPLACE m1zrmax WITH TRANSFORM(nMax)
ENDFOR
SELECT * FROM bmax

#22
fdqzy2021-06-27 01:37
以下是引用吹水佬在2021-6-26 20:46:26的发言:

不知有无理解错:
1、按记录顺序依次统计连续的10行记录,结果标注在每次的第10行记录。
2、如果某次的第10行不是“M1ZR”则不标注(即忽略这次的数据处理过程),继续下一次的数据处理过程。
USE bmax
BLANK FIELDS m1zrmax ALL
FOR nRec=1 TO RECCOUNT()-9
    GO nRec+9
    IF ALLTRIM(m1zr)!="M1ZR"
        LOOP
    ENDIF
    m = 0
    nMax = 0
    GO nRec
    SCAN NEXT 10
        IF ALLTRIM(m1zr)=="M1ZR"
            m = m + 1
        ELSE
            IF m > nMax
                nMax = m
            ENDIF
            m = 0
        ENDIF
    ENDSCAN
    IF m > nMax
        nMax = m
    ENDIF
    GO nRec+9
    REPLACE m1zrmax WITH TRANSFORM(nMax)
ENDFOR
SELECT * FROM bmax

完全是这样,版主辛苦了,为版主百问不烦的高尚精神致谢!!!

[此贴子已经被作者于2021-6-27 01:40编辑过]

1