当前位置: 首页 > article >正文

SQL:多字段混合去重后编号

SQL SERVER 库表存储人员记录,来自多种源数据,如果两条记录的 Name、Phone、Email 字段之一有重复,则说明这两条记录是同一个人。null 是数据未知,两条记录的字段都为 null 时表示两者默认不重复,是否重复要靠其他字段判断。注意,如果 A 和 B 重复,B 和 C 重复,则 A 和 C 也是重复的。

RegisterIdNamePhoneEmail
XXX-00001John Strauss241567Null
XXX-00023Rick Astley241567richardastley@gmail.com
XXX-00003John StraussNULLNULL
XXX-00099NULL241567georgeharrison@gmail.com
XXX-00085NULL256819richardastley@gmail.com
XXX-00016NULLNULLgeorgeharrison@gmail.com
XXX-00007John Deep280933NULL
XXX-00008John Deep93484NULL
XXX-00009Javier Estrada94578javier@gmail.com
XXX-00010NULL3993939939@gmail.com

要求:新增计算列人员编号 no,找到重复的记录,给每组重复的记录赋予一个独立的 no。

RegisterIdNamePhoneEmailno
XXX-00001John Strauss2415671
XXX-00023Rick Astley241567richardastley@gmail.com1
XXX-00003John Strauss1
XXX-00099241567georgeharrison@gmail.com1
XXX-00085256819richardastley@gmail.com1
XXX-00016georgeharrison@gmail.com1
XXX-00007John Deep2809337
XXX-00008John Deep934847
XXX-00009Javier Estrada94578javier@gmail.com9
XXX-000103993939939@gmail.com10

编写SPL代码

1=mssql.query("select * from tb")
2=T=A1.derive(#:no)
3

for T.count(T[1:].count( if(no!=T.no && (

(Name && T.Name && Name==T.Name) ||

(Phone && T.Phone && Phone==T.Phone) ||

(Email && T.Email && Email==T.Email)),

T.no=no=min(no,T.no) ))>0)>0

4return T

A1: 通过JDBC查询数据库。

A2:新增编号列no,缺省为记录序号#。

A3:用死循环遍历记录调整no列,如果某次遍历后有no被调整的情况,则重新遍历,直到所有no都不再调整为止。遍历记录时从上往下进行,当前是第i条记录时,把它依次与第i+1直至最后一条记录比较,如果被认为是重复记录则同步两者的no,取两者间较小的那个。字段值为null时,默认与其他记录不重复。注意null与任何值进行逻辑与运算时,都为false。

count函数返回符合条件的成员的个数,当第i条记录与i+1直至最后一条记录比较的过程中,如果有发生no被调整的动作,则内层的count将大于0,这会导致外层的count也大于0,满足继续循环的条件。

还需要有no!=T.no的条件,确保调整动作中至少有一个no值会变得更小,否则可能出现无法结束的死循环。

免费下载试用


http://www.kler.cn/a/415173.html

相关文章:

  • 02_Django路由Router
  • 人脸识别API解锁智能生活、C++人脸识别接口软文
  • 单片机知识总结(完整)
  • java全栈day10--后端Web基础(基础知识)之续集
  • QChart数据可视化
  • IDEA报错: java: JPS incremental annotation processing is disabled 解决
  • [2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(2))
  • 网安瞭望台第4期:nuclei最新poc分享
  • 算力100问☞第30问:密集计算有什么特点?
  • 电脑中的vcruntime140_1.dll文件有问题要怎么解决?一键修复vcruntime140_1.dll
  • 【力扣】541.反转字符串2
  • 银行卡OCR 识别 API 接口如何用PHP如何调用
  • 命令行使用ssh隧道连接远程mysql
  • 认识网络安全
  • 重构代码之将单向关联转换为双向关联
  • 【Npm】--legacy-peer-deps有什么用
  • CWT-CNN-SABO-LSSVM | Matlab实现基于CWT-CNN-SABO-LSSVM对滚动轴承的故障诊断
  • [241127] Mistral AI 更新 Le Chat,免费提供前沿 AI 助手!| TrendForce 预测 2025 十大科技趋势
  • 什么是第4层(TCP/UDP)和第7层(HTTP/HTTPS)
  • UDP客户端服务器通信
  • 原生微信小程序画表格
  • 嵌入式Rust小探
  • 利用树莓派Pico制作迷你小台灯:C++与硬件设计结合的分享
  • node.js基础学习-url模块-url地址处理(二)
  • JVM 常见面试题及解析(2024)
  • 网络安全(1)_对称加密和非对称加密