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

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

目录

为什么要处理重复记录

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

相关文章

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热