注册 登录
编程论坛 VFP论坛

获取记录中数值排列前N位的字段名称的组合

schtg 发布于 2023-03-11 09:04, 815 次点击
各位大侠,请帮忙,如何快速从数据表中的记录中获取其由大到小排序前3(并列也计入)的字段名称,并写入字段yh中(如图),因总记录有近20w条,谢谢!
只有本站会员才能查看附件,请 登录

创建测试数据
程序代码:
CREATE dbf tt(xm C(12),t1 n(5,1),t2 n(5,1),t3 n(5,1),t4 n(5,1),t5 n(5,1),t6 n(5,1),t7 n(5,1),t8 n(5,1),t9 n(5,1),yh C(20))
INSERT INTO tt values("AAA",51,71,56.7,51,11,30,41,70,22,"")
INSERT INTO tt values("AAB",52,78,56.7,89,12,38,48,79,28,"")
INSERT INTO tt values("AAC",53,56,53,81,13,53,45,39,25,"")
INSERT INTO tt values("AAD",54,54,56.7,49,14,31,46,19,22,"")
INSERT INTO tt values("AAE",55,48,56.7,89,15,33,43,29,26,"")
8 回复
#2
sdta2023-03-11 12:34
数组排序行不行
#3
sam_jiang2023-03-11 15:28
给你写了关键的一段代码,求一个数组中最大的几位数:
你先建立一个数组,将需要找出的最大几个数的那些数放进去,然后调用下面这个函数,他就输出了,用逗号分隔:

PARAMETERS carray,ncount &&数组carray,调用时要在前面加@,几位数ncount
creturn=""
FOR j=1 TO ncount
    themaxnum=0 &&themaxnum=carray[1] 更好
    FOR i=1 TO ALEN(carray)
        lastnum=themaxnum &&这句没用
        themaxnum=MAX(themaxnum,carray[i])
    ENDFOR
    nindex=ASCAN(carray,themaxnum)
    creturn=creturn+ALLTRIM(transform(carray[nindex]))+","
    if nindex>0 &&这句没用
        ADEL(carray,nindex)
        DIMENSION carray[ALEN(carray)-1]
    endif  &&这句没用
ENDFOR
RETURN LEFT(creturn,LEN(creturn)-1)

举例:

CLEAR
DIMENSION array1[10]
FOR i=1 TO 10
    array1[i]=RAND()*100
    ?array1[i]
endf
?maxnum(@array1,3)

[此贴子已经被作者于2023-3-11 16:03编辑过]

#4
sdta2023-03-11 15:32
程序代码:
CREATE dbf tt(xm C(12),t1 n(5,1),t2 n(5,1),t3 n(5,1),t4 n(5,1),t5 n(5,1),t6 n(5,1),t7 n(5,1),t8 n(5,1),t9 n(5,1),yh C(20))
INSERT INTO tt values("AAA",51,71,56.7,51,11,30,41,70,22,"")
INSERT INTO tt values("AAB",52,78,56.7,89,12,38,48,79,28,"")
INSERT INTO tt values("AAC",53,56,53,81,13,53,45,39,25,"")
INSERT INTO tt values("AAD",54,54,56.7,49,14,31,46,19,22,"")
INSERT INTO tt values("AAE",55,48,56.7,89,15,33,43,29,26,"")
LOCAL aa[FCOUNT()-2, 2]
FOR ln = 1 TO FCOUNT()-2
    aa[ln,1] = "T" + TRANSFORM(ln)
    aa[ln,2] = 0.0
ENDFOR
SCAN
    = ACOPY(aa,bb)
    SCATTER FIELDS T1, T2, T3, T4, T5, T6, T7, T8, T9 TO cc
    FOR ln = 1 TO ALEN(cc)
        bb[ln, 2] = cc[ln]
    ENDFOR
    = ASORT(bb,2,ALEN(bb),1)
    lnmc = 1
    lnsj = bb[1,2]
    lcStr = bb[1,1]
    FOR ln = 2 TO ALEN(bb,1)
        IF bb[ln,2] = lnsj
        ELSE
            lnmc = lnmc + 1
        ENDIF
        IF lnmc > 3
            EXIT
        ENDIF
        lcStr = lcStr + "," + bb[ln,1]
        lnsj = bb[ln,2]
    ENDFOR
    REPLACE yh WITH lcStr
ENDSCAN
BROWSE  

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

#5
sdta2023-03-11 15:53
将4楼代码简化如下
程序代码:
CREATE dbf tt(xm C(12),t1 n(5,1),t2 n(5,1),t3 n(5,1),t4 n(5,1),t5 n(5,1),t6 n(5,1),t7 n(5,1),t8 n(5,1),t9 n(5,1),yh C(20))
INSERT INTO tt values("AAA",51,71,56.7,51,11,30,41,70,22,"")
INSERT INTO tt values("AAB",52,78,56.7,89,12,38,48,79,28,"")
INSERT INTO tt values("AAC",53,56,53,81,13,53,45,39,25,"")
INSERT INTO tt values("AAD",54,54,56.7,49,14,31,46,19,22,"")
INSERT INTO tt values("AAE",55,48,56.7,89,15,33,43,29,26,"")
LOCAL aa[FCOUNT()-2, 2]
FOR ln = 1 TO FCOUNT()-2
    aa[ln,1] = "T" + TRANSFORM(ln)
    aa[ln,2] = 0.0
ENDFOR
SCAN
    = ACOPY(aa,bb)
    SCATTER FIELDS T1, T2, T3, T4, T5, T6, T7, T8, T9 TO cc
    FOR ln = 1 TO ALEN(cc)
        bb[ln, 2] = cc[ln]
    ENDFOR
    = ASORT(bb,2,ALEN(bb),1)
    lnsj = bb[3,2]
    lcStr = bb[1,1] + "," + bb[2,1] + "," + bb[3,1]
    * 从数组第四行开始与前面行的数组元素比较
    FOR ln = 4 TO ALEN(bb, 1)
        IF     bb[ln, 2] = lnsj
            lcStr = lcStr + "," + bb[ln,1]
        ELSE
            EXIT
        ENDIF
    ENDFOR
    REPLACE yh WITH lcStr
    lnsj = bb[ln,2]
ENDSCAN
BROWSE

只有本站会员才能查看附件,请 登录
#6
schtg2023-03-11 16:44
回复 2楼 sdta
行哈,谢谢!
#7
schtg2023-03-11 16:45
回复 4楼 sdta
谢谢,我稍完一些在电脑上试一下。
#8
schtg2023-03-11 16:45
回复 5楼 sdta
谢谢,看结果没有问题的哈,谢谢!
#9
schtg2023-03-11 16:46
回复 3楼 sam_jiang
谢谢,稍晚一点试一下哈。
1