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

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

目录

为什么要处理重复记录

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多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

mybatisplus的逻辑删除过程

《mybatisplus的逻辑删除过程》:本文主要介绍mybatisplus的逻辑删除过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录myBATisplus的逻辑删除1、在配置文件中添加逻辑删除的字段2、在实体类上加上@TableLogic3、业务层正常删除即

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

MybatisPlus中removeById删除数据库未变解决方案

《MybatisPlus中removeById删除数据库未变解决方案》MyBatisPlus中,removeById需实体类标注@TableId注解以识别数据库主键,若字段名不一致,应通过value属... 目录MyBATisPlus中removeBypythonId删除数据库未变removeById(Se

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于