快速数据处理:根据多字段查找重复记录及删除多余记录

本文主要是介绍快速数据处理:根据多字段查找重复记录及删除多余记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

为什么要处理重复记录

1 查询重复记录

2 查询重复记录使用的控件及代码

3 删除重复记录

4 导出数据


为什么要处理重复记录

如果一个数据集中含有重复记录,可能需要仅仅保留一条记录,清理掉多余的记录。重复记录的定义,可能仅根据一个字段值确定,也可能需要根据多个字段值确定。

这里演示以下功能:

  • 根据数据集的任意多个字段确定重复记录;
  • 导出查询结果;
  • 对于重复记录,仅保留一条,删掉多余的;

1 查询重复记录

此处需要自定义查询字段。

可以看到,使用的查询语句是:

select a.k_hzcs as 货主城市,a.l_hzdq as 货主地区,a.计数 from(select k_hzcs,l_hzdq,count(l_hzdq) as 计数 from dd group by k_hzcs,l_hzdq having 计数>1) a

这里同时完成了字段名称由英文向中文的转换,便于浏览数据。

2 查询重复记录使用的控件及代码

为了便于导出数据,显示查询结果数据这里使用了 TsWorksheetGrid 控件。

// 查询重复按钮查看重复记录情况
procedure TFormSelectFields.btnQueryClick(Sender: TObject);
varsql, sql1, sql1_groupby, sFieldEn, sFieldCn: string;i,iRow, iCol: integer;iResColCnt: integer;MyCell: PCell;
beginwsGrid.Clear;list_fields_en_duplicate.Clear;list_fields_cn_duplicate.Clear;// 选中的中文字段和英文字段列表for i := 0 to clbFieldsCn.Count - 1 dobeginif clbFieldsCn.Checked[i] thenbeginlist_fields_cn_duplicate.Append(clbFieldsCn.Items.Strings[i]);list_fields_en_duplicate.Append(lbFieldsEn.Items.Strings[i]);end;end;sql := 'select';sql1 := 'select';sql1_groupby := '';for i := 0 to list_fields_en_duplicate.Count - 1 dobeginsFieldEn := list_fields_en_duplicate.Strings[i]; // 英文字段名sFieldCn := list_fields_Cn_duplicate.Strings[i]; // 中文字段名if i = 0 thenbeginsql := sql + ' a.' + sFieldEn + ' as ' + sFieldCn;sql1 := sql1 + ' ' + sFieldEn;sql1_groupby := sFieldEn;endelsebeginsql := sql + ',a.' + sFieldEn + ' as ' + sFieldCn;sql1 := sql1 + ',' + sFieldEn;sql1_groupby := sql1_groupby + ',' + sFieldEn;end;end;sql := sql + ',a.计数 from(';sql1 := sql1 + ',count(' + sFieldEn + ') as 计数 from ' + tableEn_crud_master + ' group by ' + sql1_groupby + ' having 计数>1) a';sql := sql + sql1;memo1.append('重码sql: ' + sql);queryTmp.Close;queryTmp.SQL.Text := sql;queryTmp.Open;// 显示列名称for iResColCnt := 0 to queryTmp.FieldCount - 1 dobeginwsGrid.Worksheet.WriteText(0, iResColCnt, queryTmp.Fields[iResColCnt].FieldName);MyCell := wsGrid.Worksheet.GetCell(0, iResColCnt);MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth];MyCell^.BackgroundColor := $00FD9346;MyCell^.HorAlignment := haCenter;end;iRow := 1;queryTmp.First;while not queryTmp.EOF dobegin//wsGrid.Worksheet.WriteText(iRow, 0, sTableCn);MyCell := wsGrid.Worksheet.GetCell(iRow, 0);MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth];//wsGrid.Worksheet.WriteText(iRow, 1, sCheckTitle);MyCell := wsGrid.Worksheet.GetCell(iRow, 1);MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth];for iResColCnt := 0 to queryTmp.FieldCount - 1 dobeginwsGrid.Worksheet.WriteText(iRow, iResColCnt, queryTmp.Fields[iResColCnt].AsString);MyCell := wsGrid.Worksheet.GetCell(iRow, iResColCnt);MyCell^.Border := [cbNorth, cbWest, cbEast, cbSouth];end;iRow += 1;queryTmp.Next;end;// 调整列宽for iCol := 0 to wsGrid.Worksheet.GetLastColIndex(false) dowsGrid.ColWidths[iCol + 1] := 200;end;

3 删除重复记录

这里删除多余重复记录使用的sql语句是:

delete from dd where rowid not in(select MIN(rowid) from dd group by k_hzcs,l_hzdq)

到主页面刷新一下记录数,从830变为24。

4 导出数据

导出数据极简单。

// 导出
procedure TFormSelectFields.Button1Click(Sender: TObject);
varfn: string;
beginSaveDialog1.Filter := 'Excel文件|*.xlsx';if SaveDialog1.Execute thenbeginfn := SaveDialog1.FileName;wsGrid.Workbook.WriteToFile(fn, sfOOXML, true);end;memo1.append('保存完成: ' + fn);end; 

这篇关于快速数据处理:根据多字段查找重复记录及删除多余记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/201603

相关文章

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤