标题:请教:数据和数据之间的模糊匹配
只看楼主
lj95315
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2018-3-1
结帖率:0
已结贴  问题点数:10 回复次数:9 
请教:数据和数据之间的模糊匹配
现有两个表,表1名wcb,内有fs19,wc19两个字段;表2名cswc,有wc和fs19两个字段。
现在想让表2的fs19=表1的fs19,但表2的wc又不完全等于表1=wc19,想就近原则匹配。
请大家帮忙,非常感谢。
位次转换.rar (10.53 KB)
搜索更多相关主题的帖子: 匹配 等于 字段 数据 模糊 
2020-07-21 11:21
yuantao100
Rank: 2
等 级:论坛游民
帖 子:61
专家分:16
注 册:2012-7-5
得分:4 
select a.fs19,a.wc19,b.wc from wcb a,cswc b where a.fs19=b.fs19
2020-07-21 11:46
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:4 
如何就近匹配原则,举例说明

坚守VFP最后的阵地
2020-07-22 11:39
lj95315
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2018-3-1
得分:0 
回复 3楼 sdta
比如,图片中的,21名就对应706分,33名也对应706分,419名对应694分。
2020-07-22 12:01
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
我记得论坛有这个问题的回复,自己先找找

坚守VFP最后的阵地
2020-07-22 12:16
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
程序代码:
CLOSE DATABASES 
SET NEAR ON 
USE wcb 
INDEX on wc19 TAG wc
USE cswc IN 0
SELECT cswc
BLANK FIELDS fs19 ALL 
STORE 0 TO ln11, ln12, ln21, ln22
SCAN
    SEEK cswc.wc IN wcb
    ln11 = wcb.wc19
    ln12 = wcb.fs19
    IF RECNO("wcb") > 1
        GO RECNO() - 1 IN wcb
    ENDIF 
    ln21 = wcb.wc19
    ln22 = wcb.fs19
    REPLACE fs19 WITH IIF(wc - ln11 <= ln21 - wc, ln22, ln12)
ENDSCAN
SELECT cswc
BROWSE 

坚守VFP最后的阵地
2020-07-22 14:05
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
上述结果中,可能会有点小问题,当CSWC表中的WC与WCB表中的上下两值距离相等时,取的是上限。

[此贴子已经被作者于2020-7-22 14:15编辑过]


坚守VFP最后的阵地
2020-07-22 14:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
没校对,不知对否

SET NEAR ON
SELECT * FROM cswc INTO CURSOR swc READWRITE
USE wcb IN 0 ALIAS awc
nCount = RECCOUNT("awc")
USE wcb IN 0 ALIAS dwc AGAIN
SELECT awc
INDEX on wc19 TAG awc
SELECT dwc
INDEX on wc19 TAG dwc DESCENDING
SELECT swc
SCAN
    SEEK swc.wc IN "awc"
    IF RECNO("awc") > nCount
        GO BOTTOM IN "awc"
    ENDIF
    SEEK swc.wc IN "dwc"
    IF RECNO("dwc") > nCount
        GO BOTTOM IN "dwc"
    ENDIF
    REPLACE swc.fs19 WITH IIF(ABS(swc.wc-awc.wc19)<ABS(swc.wc-dwc.wc19), awc.fs19, dwc.fs19)
ENDSCAN
SELECT * FROM swc
2020-07-22 16:17
lj95315
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2018-3-1
得分:0 
等下测试一下,感谢各位大神!
2020-07-23 16:48
lj95315
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2018-3-1
得分:0 
感谢楼上两位,测试成功。
2020-07-23 18:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502581-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.782330 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved