| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 464 人关注过本帖
标题:关于多重条件判断的请教
只看楼主 加入收藏
sharpex1
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2021-12-12
收藏
得分:0 
程序代码:
* 清除之前的定义
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

只会这样写代码,求大佬优化
2024-04-09 14:57
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1068
专家分:2607
注 册:2015-12-30
收藏
得分:0 
以下是引用sharpex1在2024-4-9 14:31:39的发言:

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

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

2024-04-09 14:58
sharpex1
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2021-12-12
收藏
得分:0 
回复 12楼 laowan001
应该会误判,只判断出现次数,得到一个系数,最后根据系数求和值判断是不是同一个人,因为各系数对应的不是同一个号码,所以最后系数求和大于0.5,也根本不知道和哪个号码设置 相同的客户编号
2024-04-09 15:06
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1068
专家分:2607
注 册:2015-12-30
收藏
得分:0 
以下是引用sharpex1在2024-4-9 15:06:01的发言:

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

仔细想想确实是会误判
那就可以考虑另外建立一个表,两个字段,每个条件有相同的号码对儿就插入到这个表里,同时累加系数,如果有某些号码对的系数超过0.5就能判断了吧?
2024-04-09 15:15
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:173
专家分:1223
注 册:2023-6-29
收藏
得分:0 
我看你的要求只需要确认两个号码是否为同一个人, 那么只要找出给定的两个号码的数据,然后再判断即可, 不用把所有数据标志出来

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

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

不只是比对ID 0.3、地址 0.2、软的 0.1和硬的 0.1吗?
客户编号又是什么关系?
最好给点测试数据
2024-04-09 18:07
快速回复:关于多重条件判断的请教
数据加载中...
 
   



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

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