注册 登录
编程论坛 VFP论坛

关于多重条件判断的请教

sharpex1 发布于 2024-04-08 18:05, 1109 次点击
碰到一个问题,暂时想不到解决思路,请各位大神赐教
有个40万基础表,里面有号码,地址,用户ID,在用APP,在用硬件,希望判断两个号码是否是同一个人,思路是,号码两两比较 用户ID相同,那么给个0.3系数,如果地址相同,给个0.2系数,如果在用APP相同,给个0.1系数,在用硬件相同,给个0.1系数,当所有系数加起来大于0.5,那么两个号码是同一个人,这个时候给两个号码 赋予相同的 客户编号,比如A1,后面可以通过客户编号就能筛选出哪些号码可能是同一个人,求各位大神赐教思路,最好有代码
21 回复
#2
yiyanxiyin2024-04-08 18:15
满屏的思路, 怎么又想不到思路, 是需要更好的思路还是需要代码
#3
sharpex12024-04-08 18:19
回复 2楼 yiyanxiyin
代码,四十多万的数据,如果真的号码两两比较是不是很慢
#4
yiyanxiyin2024-04-08 18:34
在一个sql语句里面完成, 做cross join (这就是两两比较), 比较两个表的字段求出系数, 试一下
#5
yiyanxiyin2024-04-08 18:47
先筛出部分数据来测试
#6
sdta2024-04-08 20:38
实战才能解决问题
#7
laowan0012024-04-09 08:04
思路是,号码两两比较 用户ID相同,那么给个0.3系数

也许楼主被思路描述给限制了。换个说法,用户ID相同的两个号码,给个系数...
用SQL表示
select 用户ID,count(distinct 号码) HMcount from 基础表 group by 用户ID having count(distinct 号码)>1
查询结果为相同用户ID有两个或以上不同号码的记录
赋值相应系数
其他条件做法也相同
有了系数,后面的判断就可以做了

#8
laowan0012024-04-09 08:06
以下是引用sharpex1在2024-4-8 18:19:26的发言:

代码,四十多万的数据,如果真的号码两两比较是不是很慢

不仅是号码比较,还有地址、APP等,两两比较肯定是效率最低的方法,不可取
#9
easyppt2024-04-09 08:19
上一个问题里,我给的代码,稍微改进一下,就能实现。
就是自身查询和比较,条件满足则给出系数值。

#10
sharpex12024-04-09 14:31
回复 7楼 laowan001
这个方法我想过,存在问题,因为A号码可能和B号码 地址相同,和C号码 硬件相同,和D号码 软件相同,最后得到的系数是判断不了到底和哪个号码是 同一个人
#11
sharpex12024-04-09 14:57
程序代码:

* 清除之前的定义
CLEAR

* 创建一个名为 BaseTable 的表,包含号码([color=#0000FF]Number)、地址(Address)、用户ID(UserID)、在用APP(UsingApp)、在用硬件(UsingHardware)字段[/color]
CREATE TABLE BaseTable (
    Number CHAR(10),
    Address CHAR(50),
    UserID CHAR(10),
    UsingApp LOGICAL,
    UsingHardware LOGICAL,
    CustomerID CHAR(10)
)

* 创建索引
INDEX ON UserID TAG UserID
INDEX ON Address TAG Address

* 初始化客户编号
LOCAL nBatchSize, nTotalRows, nCustomerID
nBatchSize = 1000  && 设置分批大小
nTotalRows = RECCOUNT()  && 获取总记录数
nCustomerID = 1  && 设置初始客户编号为1

* 分批处理数据
FOR i = 1 TO nTotalRows STEP nBatchSize
    SELECT BaseTable
    GO i IN 0
    SCAN WHILE NOT EOF() AND RECNO() < (i + nBatchSize)
        * 初始化系数和客户编号
        LOCAL nCoefficient
        nCoefficient = 0

        * 保存当前记录的 RECNO() 值,以便后续定位
        nCurrentRecno = RECNO()

        * 比较用户ID
        IF SEEK(BaseTable.UserID, 'UserID')
            nCoefficient = nCoefficient + 0.3
        ENDIF
            
        * 比较地址
        IF SEEK(BaseTable.Address, 'Address')
            nCoefficient = nCoefficient + 0.2
        ENDIF
            
        * 比较在用APP情况
        IF SEEK(BaseTable.UsingApp, 'UsingApp')
            nCoefficient = nCoefficient + 0.1
        ENDIF
            
        * 比较在用硬件情况
        IF SEEK(BaseTable.UsingHardware, 'UsingHardware')
            nCoefficient = nCoefficient + 0.1
        ENDIF
            
        * 如果系数总和大于0.5,则将两个号码设置为同一个客户编号
        IF nCoefficient > 0.5
            cCustomerID = "A" + LTRIM(STR(nCustomerID))  && 构造客户编号
            nCustomerID = nCustomerID + 1  && 递增客户编号
        ELSE
            cCustomerID = ""  && 如果系数总和小于等于0.5,则客户编号为空
        ENDIF
            
        * 更新客户编号
        IF nCurrentRecno > 0
            REPLACE CustomerID WITH cCustomerID FOR RECNO() = nCurrentRecno
        ENDIF
            
        * 移动到下一行
        SKIP
    ENDSCAN
ENDFOR

* 显示更新后的表
SELECT * FROM BaseTable

只会这样写代码,求大佬优化
#12
laowan0012024-04-09 14:58
以下是引用sharpex1在2024-4-9 14:31:39的发言:

这个方法我想过,存在问题,因为A号码可能和B号码 地址相同,和C号码 硬件相同,和D号码 软件相同,最后得到的系数是判断不了到底和哪个号码是 同一个人

最后不是按各系数之和判断吗?象你说的这种情况,系数之和不会大的,也就不会误判。

#13
sharpex12024-04-09 15:06
回复 12楼 laowan001
应该会误判,只判断出现次数,得到一个系数,最后根据系数求和值判断是不是同一个人,因为各系数对应的不是同一个号码,所以最后系数求和大于0.5,也根本不知道和哪个号码设置 相同的客户编号
#14
laowan0012024-04-09 15:15
以下是引用sharpex1在2024-4-9 15:06:01的发言:

应该会误判,只判断出现次数,得到一个系数,最后根据系数求和值判断是不是同一个人,因为各系数对应的不是同一个号码,所以最后系数求和大于0.5,也根本不知道和哪个号码设置 相同的客户编号

仔细想想确实是会误判
那就可以考虑另外建立一个表,两个字段,每个条件有相同的号码对儿就插入到这个表里,同时累加系数,如果有某些号码对的系数超过0.5就能判断了吧?
#15
yiyanxiyin2024-04-09 15:28
我看你的要求只需要确认两个号码是否为同一个人, 那么只要找出给定的两个号码的数据,然后再判断即可, 不用把所有数据标志出来

将上面的实现封装成一个函数:   IsSamePerson(Number1,Number2)  , 要用的时候调用即可,  我想这个函数不管你如何写速度应该会很快
#16
sharpex12024-04-09 16:28
回复 15楼 yiyanxiyin
具体怎么实现,求教
#17
吹水佬2024-04-09 16:55
先取出lD和地址有重复的记录排队一下(其他记录都不大于0.5无需处理)
下一步就便捷了,关联一下lD地址判断软硬就是了
几十万记录应该不会慢
#18
sharpex12024-04-09 17:41
回复 17楼 吹水佬
你这个思路下我的客户编号怎么 添加呢。。。
#19
sharpex12024-04-09 17:46
* 比较用户ID
        IF SEEK(BaseTable.UserID, 'UserID')
            nCoefficient = nCoefficient + 0.3
        ENDIF
请教一下这里为什么提示找不到别名
#20
吹水佬2024-04-09 18:07
以下是引用sharpex1在2024-4-9 17:41:17的发言:

你这个思路下我的客户编号怎么 添加呢。。。

不只是比对ID 0.3、地址 0.2、软的 0.1和硬的 0.1吗?
客户编号又是什么关系?
最好给点测试数据
#21
sharpex12024-04-10 09:02
回复 20楼 吹水佬
判断为同一个人,客户编号就赋予同样的编号,后面通过客户编号筛选做 下一步处理,已增加测试附件
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2024-4-10 11:50编辑过]

#22
sharpex12024-04-22 15:50
论坛停了几天。。继续求教
1