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

news2024/11/15 11:31:30

目录

为什么要处理重复记录

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);
var
  sql, sql1, sql1_groupby, sFieldEn, sFieldCn: string;
  i,iRow, iCol: integer;
  iResColCnt: integer;

  MyCell: PCell;
begin
  wsGrid.Clear;

  list_fields_en_duplicate.Clear;
  list_fields_cn_duplicate.Clear;

  // 选中的中文字段和英文字段列表
  for i := 0 to clbFieldsCn.Count - 1 do
  begin
    if clbFieldsCn.Checked[i] then
    begin
      list_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 do
  begin
    sFieldEn := list_fields_en_duplicate.Strings[i]; // 英文字段名
    sFieldCn := list_fields_Cn_duplicate.Strings[i]; // 中文字段名
    if i = 0 then
    begin
      sql := sql + ' a.' + sFieldEn + ' as ' + sFieldCn;
      sql1 := sql1 + ' ' + sFieldEn;
      sql1_groupby := sFieldEn;
    end
    else
    begin
      sql := 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 do
  begin
    wsGrid.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 do
  begin
    //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 do
    begin
      wsGrid.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) do
    wsGrid.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);
var
  fn: string;
begin
  SaveDialog1.Filter := 'Excel文件|*.xlsx';
  if SaveDialog1.Execute then
  begin
    fn := SaveDialog1.FileName;
    wsGrid.Workbook.WriteToFile(fn, sfOOXML, true);
  end;

  memo1.append('保存完成: ' + fn);

end; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构师成长路线图

成长为软件架构师不是一件容易的事,这篇文章列举了架构师需要学习的技术储备,给出了成为软件架构师的路线图,帮助有志于在架构领域成长的同学可以明确学习的方向。原文:Master Plan for becoming a Software Architect[1] Danist …

最新AI创作系统ChatGPT源码+详细搭建部署教程,支持AI绘画/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

苹果FindMy

随着科技的不断发展,人们的生活越来越离不开各种电子设备。然而,随着设备的增多,如何有效地管理和追踪这些设备成为了一个日益突出的问题。针对这一问题,苹果公司推出了一款名为“Find My”的应用程序,为全球的苹果用户…

Blender:渲染一个简单动画

接上 Blender:对模型着色_六月的翅膀的博客-CSDN博客 目标是做一个这种视频 先添加一个曲线,作为相机轨迹 然后添加一个相机 对相机添加物体约束,跟随路径,选择曲线,然后点击动画路径 假如对相机设置跟随路径后&…

新闻软文稿件媒体发布怎么做?纯干货

新闻软文稿件需要投放在正确的媒体上,才能获得更好的宣传推广效果,新闻软文稿件媒体发布怎么做?今天伯乐网络传媒就来给大家讲解一下,纯干货,建议收藏起来慢慢看。 一、媒体选择与分析 1. 确定目标媒体 在进行新闻软…

从物联网到万物互联:AI与6G融合,实现互联智能

物联网市场正在快速增长。它正在走进全球每一个家庭。据McKinsey预测,到2030年,全球物联网市场将达到12.6万亿美元。但是,如今,它已不再严格限于机器对机器(M2M)通信。 物联网(IoT)建立了一个网络,用于连接物理对象&am…

数据结构(一)—— 数据结构简介

文章目录 一、基本概念和术语?1.1、数据1.2、数据元素1.3、数据项(属性、字段)1.4、数据对象1.5、数据结构 二、逻辑结构和物理结构(存储结构)2.1、逻辑结构1、定义2、分类(线性结构和非线性结构&#xff0…

机器学习 Q-Learning

对马尔可夫奖励的理解 看的这个教程 公式:V(s) R(s) γ * V(s’) V(s) 代表当前状态 s 的价值。 R(s) 代表从状态 s 到下一个状态 s’ 执行某个动作后所获得的即时奖励。 γ 是折扣因子,它表示未来奖励的重要性,通常取值在 0 到 1 之间。…

程序员个性终端指南(cmder、powershell、window terminal)

序言 工欲善其事,必先利其器。对于 IT 从业者,命令行终端是一道绕不过的坎,日常开发、服务运维都要用到这个工具。 这里我介绍下从业多年来用过的 windwos 平台下终端工具。 CMD/命令行提示符 这个是 windows 自带的工具,平平无…

10.12按键中断

设置按键中断,按键1按下,LED亮,再按一次,灭 按键2按下,蜂鸣器响。再按一次,不响 按键3按下,风扇转,再按一次,风扇停 keyit.h: #ifndef __KEYIT_H__ #define __KEYIT_…

speech recognization

目标,在播放声音的时候,禁用掉麦克风 新建立一个文件夹,然后拖入vscode中 然后创建虚拟环境,vscode会自动帮我们创建虚拟环境,手动激活虚拟环境 source venv/bin/activate import speech_recognition as sr import …

免费使用Salesforce Data Cloud!详细操作步骤来啦

Data Cloud是Salesforce向市场推出的增长最快的产品,这对Salesforce来说是一个重要竞争优势。 近期,Salesforce宣布客户可以免费使用Data Cloud。这就是所谓的零美元SKU,换句话说,这是一条不会产生任何成本的Salesforce产品线。 …

云原生Kubernetes:K8S集群版本升级(v1.20.15 - v1.22.14)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群(v1.21.14) 4.验证集群(v1.21.14) 5.升级集群(v1.22.14) 6.验证集群 (v1.22.14) 二、实验 1.升级集群(v1.21.14) 2.验…

03在命令行环境中创建Maven版的Java工程,了解Java工程的目录结构并编写代码,执行Maven的构建命令

创建Maven版的Java工程 Maven工程的坐标 数学中使用x、y、z三个向量可以在空间中唯一的定位一个点, Maven中也可以使用groupId,artifactId,version三个向量在Maven的仓库中唯一的定位到一个jar包 groupId: 公司或组织域名的倒序, 通常也会加上项目名称代表公司或组织开发的一…

Pygame中将鼠标形状设置为图片2-1

在Pygame中利用Sprite类的派生类将鼠标形状设置为图片,其原理就是将Sprite类的派生类对应图片的位置设置为鼠标的当前位置即可。其效果如图1所示。 图1 将鼠标设置为图片 从图1可以看出,鼠标的形状变为红色的,该红色的随着鼠标的移动而移动&…

SQL:left join、right join 究竟什么区别?

1、SQL join 分三种 1)inner join(内连接,也叫等值连接) 显示两个表中有联系的所有数据,是默认方式。 2)cross join(交叉连接) 两个表格做笛卡尔积,显示的数据行数是…

LeetCode416 分割等和子集

题目: 、 分析: 因为分割的子数组,不连续;所以双指针、栈,一般不适用,分析起来很像是DP问题。 思路: https://www.imooc.com/article/300277 代码: //TODO 这题有难度

基于spring boot的多维分类的知识管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 用户管理 知识分类管理 知识信息管理 知识信息添加 用户功能实现 首页 知识信息 个人中心 我的收藏 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着国内市场经济这几十年来的蓬勃发展&…

Docker网络管理和数据管理

目录 Docker网络 Docker 网络实现原理 为容器创建端口映射 查看容器的输出和日志信息 Docker 的网络模式 查看docker网络列表 指定容器网络模式 网络模式详解 host模式 container模式 none模式 bridge模式 自定义网络 Docker数据管理 数据卷 数据卷容器 容器互联 Do…

【Leetcode】 406. 根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 peopl…