注册 登录
编程论坛 VFP论坛

求字段中的最大值、最小值、不重复值个数等

yd1954 发布于 2021-12-14 11:43, 3658 次点击
各位老师好!
发过去二个表,n1n5,zdz.
求:当表n1n5中的n1字段值=80时,求n5字段的最大值、最小值、有多少个值、有多少个不重复的值;   
    当表n1n5中的n1字段值=81时,求n5字段的最大值、最小值、有多少个值、有多少个不重复的值;
    当表n1n5中的n1字段值=82时,求n5字段的最大值、最小值、有多少个值、有多少个不重复的值;
    ........
    当表n1n5中的n1字段值=188时,求n5字段的最大值、最小值、有多少个值、有多少个不重复的值。
    将这些值放到表zdz的s80,s81,s82.....s188字段。
    表zdz已有4条记录,是手动统计录入的,没有不重复值的记录。
    将表n1n5中的qihao,h1,h2,n3最后一行带入表zdz的qihao,h1,h2,h3。
    将表n1n5表名带入zdz的zd字段。
    s80,s81,s82......s188字段为字符型,数值型不能间隔,不易区分。
   
四个截图的说明:
    n1n580,是表n1n5中字段n1=80时的截图,在表zdz中s80字段记    0
    n1n582,是表n1n5中字段n1=82时的截图,在表zdz中s82字段记    97   1
    n1n5178,是表n1n5中字段n1=178时的截图,在表zdz中s178字段记 152 178 2 2
    n1n5106,是表n1n5中字段n1=106时的截图,在表zdz中s106字段记 100 136 24 19

下面是我把11月28日吹水佬老师写的程序里的值排列下来,连续执行,一次完成。提供给各位老师。

SELECT RECNO() 记录号,* FROM n1n5 INTO CURSOR tmp
SELECT a.记录号,a.n1,b.记录号,b.n5 FROM tmp a JOIN tmp b ON a.n1==80 AND a.记录号==b.记录号-1

SELECT RECNO() 记录号,* FROM n1n5 INTO CURSOR tmp
SELECT a.记录号,a.n1,b.记录号,b.n5 FROM tmp a JOIN tmp b ON a.n1==81 AND a.记录号==b.记录号-1

SELECT RECNO() 记录号,* FROM n1n5 INTO CURSOR tmp
SELECT a.记录号,a.n1,b.记录号,b.n5 FROM tmp a JOIN tmp b ON a.n1==82 AND a.记录号==b.记录号-1

.........

SELECT RECNO() 记录号,* FROM n1n5 INTO CURSOR tmp
SELECT a.记录号,a.n1,b.记录号,b.n5 FROM tmp a JOIN tmp b ON a.n1==188 AND a.记录号==b.记录号-1




只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
22 回复
#2
gs25367856782021-12-14 13:05
太复杂了,你还是转化到EXCEL中去弄弄,到是很简单的。
#3
吹水佬2021-12-14 15:16
是按n1字段值分类统计吧
#4
yd19542021-12-14 15:50
回复 3楼 吹水佬
吹水佬老师,是。
#5
吹水佬2021-12-14 21:53
不知有无理解错
只有本站会员才能查看附件,请 登录



[此贴子已经被作者于2021-12-14 22:00编辑过]

#6
吹水佬2021-12-14 22:03
程序代码:
dbfFile = "n1n5"
USE (dbfFile )
GO BOTTOM
SCATTER FIELDS qihao,h1,h2,h3 TO arr
SELECT n1,n5,COUNT(*) cnt  FROM n1n5 WHERE BETWEEN(n1,80,188) GROUP BY n1,n5 INTO CURSOR t1
SELECT *, "      " zd,000000 最大值,000000 最小值,000000 多少个值,000000 多少个不重复 FROM n1n5 WHERE .F. INTO CURSOR t2 READWRITE
SELECT t2
INDEX on n1 TAG n1
SELECT t1
SET RELATION TO n1 INTO "t2"
SCAN
    IF !FOUND("t2")
        INSERT INTO t2 (n1,最小值,最大值) VALUES (t1.n1,t1.n5,t1.n5)
    ENDIF
    IF t1.n5 > t2.最大值
        REPLACE t2.最大值 WITH t1.n5
    ELSE
        IF t1.n5 < t2.最小值
            REPLACE t2.最小值 WITH t1.n5
        ENDIF               
    ENDIF
    REPLACE t2.多少个值 WITH t2.多少个值 + &&累计
    IF ==1
        REPLACE t2.多少个不重复 WITH t2.多少个不重复 + 1
    ENDIF
ENDSCAN
SELECT t2
REPLACE ALL qihao WITH arr[1],h1 WITH arr[2],h2 WITH arr[3],h3 WITH arr[4],zd WITH dbfFile
SELECT * FROM t2


[此贴子已经被作者于2021-12-14 22:18编辑过]

#7
吹水佬2021-12-15 11:35
程序代码:
dbfFile = "n1n5"
USE (dbfFile )
GO BOTTOM
SCATTER FIELDS qihao,h1,h2,h3 TO arr
SELECT n1,n5,COUNT(*) cnt FROM n1n5 WHERE BETWEEN(n1,80,188) GROUP BY n1,n5 INTO CURSOR t1
SELECT 0000000 qihao, 0 h1, 0 h2, 0 h3, n1,;
        "      " zd,;
        MAX(n5) 最大值,;
        MIN(n5) 最小值,;
        SUM(cnt) 多少个值,;
        SUM(IIF(cnt==1,1,0)) 多少个不重复;
    FROM t1;
    GROUP BY n1;
    INTO CURSOR t2 READWRITE
SELECT t2
REPLACE ALL qihao WITH arr[1],h1 WITH arr[2],h2 WITH arr[3],h3 WITH arr[4],zd WITH dbfFile
SELECT * FROM t2
#8
yd19542021-12-15 13:19
回复 6楼 吹水佬
吹水佬老师,你好!
非常感谢你的帮助。
抱歉,我把要求搞错了。准确的要求是:当表n1n5中的n1字段值=80时,求n5字段下一行的最大值、最小值、有多少个值、有多少个不重复的值;   
                                    当表n1n5中的n1字段值=81时,求n5字段下一行的最大值、最小值、有多少个值、有多少个不重复的值;
                                    当表n1n5中的n1字段值=82时,求n5字段下一行的最大值、最小值、有多少个值、有多少个不重复的值;
                                    ........
                                    当表n1n5中的n1字段值=188时,求n5字段下一行的最大值、最小值、有多少个值、有多少个不重复的值。
                                    将这些值放到表zdz的s80,s81,s82.....s188字段。
你11月28日写的程序,就是n5下一行数据。
恳请老师再帮助改一下。谢谢。
另外,请老师把运行结果形成自由表。
#9
吹水佬2021-12-15 14:45
回复 8楼 yd1954
有点不明
例如:
n1  n5
80  11
85  22
90  33
80  44
90  55
80  66
95  22
80  88
是不是这意思:
每当n1=80时,下一行的n5有:22、55、22
最大值55、最小值22、有3个值、有1个不重复的值
#10
yd19542021-12-15 15:52
回复 9楼 吹水佬
吹水佬老师,你好!
我用你11月28日的程序得出下列:
n1=80时  n1,n5均为0,就是说,在表中n1没有=80的;
n1=81    n1n5同上
n1=82    n5的下一行=97
n1=83    同n1=80
n1=84    n5的下一行=98
n1=85    同n1=80
n1=86    n5的下一行=95
n1=87    得0
n1=88    得0
n1=89    n5的下一行 83、90、92、111 最大数111,最小数83,多少值4,不重复值4  
n1=90    得0
n1=91    n5的下一行 101、102、103、105、108  最大数108,最小数101,多少值5,不重复值5

n1=91的具体说明     表中1202行n1=91,1203行n5=101
                    表中2451行n1=91,2452行n5=105
                    表中3151行n1=91,3152行n5=102
                    表中4540行n1=91,4541行n5=108
                    表中4542行n1=91,4543行n5=103

不知是否说明白了。
再次感谢老师的帮助。

#11
吹水佬2021-12-15 18:02
回复 10楼 yd1954
分析问题尽量简化
说说9楼的数据,每当n1=80时最终所要的结果:最大值、最小值、有多少个值、有多少个不重复的值


[此贴子已经被作者于2021-12-15 18:05编辑过]

#12
yd19542021-12-15 19:11
回复 11楼 吹水佬
当n1=80时,用下面的程序统计
USE n1n5 IN 0 ALIAS a
USE n1n5 IN 0 ALIAS b AGAIN
SELECT RECNO() 记录号,* FROM n1n5 INTO CURSOR tmp
SELECT a.记录号,a.n1,b.记录号,b.n5 FROM tmp a JOIN tmp b ON a.n1==80 AND a.记录号==b.记录号-1
记录为空,说明n1字段中没有=80的,因此,n5也为空,记为0
#13
吹水佬2021-12-15 19:36
回复 12楼 yd1954
之前贴的问题不是一回事
暂时不去解决实际问题
先搞明你的思路,先按照你的思路直接回答我的问题,我才好知道你在想什么。否则,我就没法想下去。
#14
yd19542021-12-15 19:56
回复 13楼 吹水佬
吹水佬老师,你好!
我的思路是:当表n1n5中的n1字段值=80时,求n5字段下一行的最大值、最小值、有多少个值、有多少个不重复的值;   
            当表n1n5中的n1字段值=81时,求n5字段下一行的最大值、最小值、有多少个值、有多少个不重复的值;
            当表n1n5中的n1字段值=82时,求n5字段下一行的最大值、最小值、有多少个值、有多少个不重复的值;
            ........
            当表n1n5中的n1字段值=188时,求n5字段下一行的最大值、最小值、有多少个值、有多少个不重复的值。

老师11月28日的程序已经解决上述“下一行”的问题,只是n1的每个值的最大值、最小值、有多少个值、有多少个不重复的值
都要手动统计,才有了现在的想法。
11月28日的程序:
USE n1n5 IN 0 ALIAS a
USE n1n5 IN 0 ALIAS b AGAIN
SELECT RECNO() 记录号,* FROM n1n5 INTO CURSOR tmp
SELECT a.记录号,a.n1,b.记录号,b.n5 FROM tmp a JOIN tmp b ON a.n1==80 AND a.记录号==b.记录号-1

这就是我的思路,不知是否说明白了。
#15
吹水佬2021-12-15 20:13
我9楼给出一组n1n5数据,你算不出当n1=80时所要的结果(最大值、最小值、有多少个值、有多少个不重复的值)吗?
算得出就算给我看看。
算不出就不用说下去了,我真无法理解你在想什么。
或者说说算不出的原因。
#16
yd19542021-12-15 20:34
回复 15楼 吹水佬
回复 8楼 yd1954
有点不明
例如:
n1  n5
80  11
85  22
90  33
80  44
90  55
80  66
95  22
80  88
是不是这意思:
每当n1=80时,下一行的n5有:22、55、22
最大值55、最小值22、有3个值、有1个不重复的值

是这个意思。
我刚明白,这些数字是假设的。我的反应有些慢。对不起,抱歉。



#17
吹水佬2021-12-16 10:24
回复 16楼 yd1954
这样讨论就好,你问我答,我问你答,双方就会想到一块。
还是用n1=80来说,按照之前的贴上下行数据的处理方法,将n1=80的n5换成下一行的n5
结果:
n1  n5
80  22
85  22
90  33
80  55
90  55
80  22
95  22
80  88
这样就可能用6、7楼的方法得出结果


[此贴子已经被作者于2021-12-16 10:29编辑过]

#18
yd19542021-12-16 15:28
回复 17楼 吹水佬
老师好!
我太笨了,几个小时也没找到“n1=80的n5”,也不会“换成下一行的n5”。
还请老师帮助指点。
#19
吹水佬2021-12-16 16:03
回复 18楼 yd1954
不笨,只是没认真看回复
n1=80 只是例如,是假设,不是真实数据
可改为n1=82、n1=89、n1=98.........
作为讨论用一个数来分析就可以了,其他所有的n1同理
还有:
n1  n5
80  11
80  22
80  33
98  44
这种情况的n1=80的下一行n5是不是:22、33、44
#20
yd19542021-12-16 20:11
回复 19楼 吹水佬
老师好!
我认真看了17楼回复,再次看了6楼的代码。
我想找到能代表“n1=80的n5”句子,我觉得应该在这两句:

SELECT n1,n5,COUNT(*) cnt  FROM n1n5 WHERE BETWEEN(n1,80,188) GROUP BY n1,n5-1 INTO CURSOR t1
SELECT *, "      " zd,000000 最大值,000000 最小值,000000 多少个值,000000 多少个不重复 FROM n1n5 WHERE .F. INTO CURSOR t2 READWRITE

但我不知在什么位置改“下一行的n5”,也不知道“下一行的n5”代码怎么写。

下面scan
.......
endscan   是具体计算。

请老师指教。
#21
吹水佬2021-12-16 20:16
回复 20楼 yd1954
先回答我的问题,看19楼的回复
#22
yd19542021-12-16 21:55
回复 21楼 吹水佬

n1  n5
80  11
80  22
80  33
98  44
这种情况的n1=80的下一行n5是不是:22、33、44

#23
吹水佬2021-12-17 11:22
没校对,看对否
只有本站会员才能查看附件,请 登录

程序代码:
cDZ = "n1n5"
dbfFile = cDZ + ".dbf"
tmpFile = "tmp.dbf"
COPY FILE (dbfFile) TO (tmpFile)
USE (tmpFile) IN 0 ALIAS a
USE (tmpFile) IN 0 ALIAS b AGAIN
GO BOTTOM
SCATTER FIELDS qihao,h1,h2,h3 TO arr
SELECT a
SET RELATION TO RECNO()+1 INTO "b"  &&当前行与下一行关联
REPLACE ALL a.n5 WITH b.n5  &&将下一行的n5放到当前行的n5
SET RELATION TO
SELECT n1,n5,COUNT(*) cnt FROM a WHERE BETWEEN(n1,80,188) GROUP BY n1,n5 INTO CURSOR t1 &&按n1n5分类统计记录数
SELECT arr[1] qihao, arr[2] h1, arr[3] h2, arr[4] h3, n1,cDZ zd,;
        MAX(n5) 最大值,;
        MIN(n5) 最小值,;
        SUM(cnt) 多少个值,;
        SUM(IIF(cnt==1,1,0)) 多少个不重复;
    FROM t1;
    GROUP BY n1;
    INTO CURSOR t2 READWRITE
SELECT * FROM t2

1