postgresql使用group by进行数据去重-2022新项目
一、业务场景
数据去重是web开发中经常会遇到的方式之一,数据库操作中有一个关键字distinct主要就是用来做这件事,用来进行去重。
比如进行统计查询的时候,可以这样写 select count(dintinct(需要去重的字段)) from table;这样如果统计的时候,某个字段存在
重复时,就可以很好的去重。现在自己遇到的这种情况不能使用distinct关键字进行去重,因为表中创建得有主键ID,id并不重复,
只是数据表中保存的其他字段存在重复数据,这时候该如何去重呢?
二、需求分析
首先进行分析,表中的主键id一直是不断递增的,表中保存的字段数据可能存在重复数据,查询的时候就需要去掉这些重复数据。
举个简单的示例如下,
表中有五个字段,主键ID是一直自增的,用户ID可以存储重复数据,project、link_id、link_man字段都可以存储重复数据,这种设计
方式也是根据实际需要来进行设计的。一个用户可能对应多个项目,一个项目又可能对应联系人,用户id,项目,联系人id这三个字段
创建了对应的唯一索引,数据不会重复。就是现在需要查询的数据是根据用户ID查询对应的联系人信息,可以忽略掉项目这一栏?这个
怎么查询呢?
三、解决方案
自己首先想到的是使用distinct来进行查询,select distinct(t.link_id) link_id,id,user_id,link_man from test_group_by t;
结果没有去重.
继续进行分析,首先要对link_id进行去重,然后在查询的时候,将去重后的link_id一起传入到查询语句中,
这种方式虽然能够实现效果,可是操作起来非常地麻烦。需要写两个查询,能实现功能,可是不可取。最好
是在一个SQL中完成去重的操作。自己能想到的办法首先是使用group by进行分组操作,如下所示,
然后在这个查询的基础之上在去获取主键ID字段;
直接添加是不可取的,因为id不在group by 中。
如果加上id进行group by,则达不到去重的效果。那怎么办呢?在使用group by的时候,查询列还可以使用聚合函数,比如min或者是
Max()函数,继续改进。
这种方式达到了去重的效果,并且获取到不重复数据的主键ID,那这样就比较好办了。只取一列即可,
完成一大步了,下一步尝试在原来的简单查询的基础上使用主键id进行in的查询,看能否得到想要的结果。
测试结果可以得到想要的结果,min函数修改为max,尽量获取最新的数据。
之后进行拓展,还有一种写法也可以实现这个查询。
当然使用in查询的方式更加的简便,也更容易理解,到此使用group by 去重的方式全部完成。
postgresql使用group by进行数据去重-2022新项目的更多相关文章
- mybatis-拦截器实际应用-替换表名-2022新项目
一.业务场景 考虑到新项目中部分与业务数据相关的表在后期数据量会比较大,架构师在最开始设计项目中与业务数据相关的表时,就已经考虑使用分表来 进行处理,给业务数据相关的每张表都添加统一批次的后缀,查询这 ...
- Java异步记录日志-2022新项目
一.业务场景 web项目开发中,经常会有的一个操作是记录请求日志,比如记录请求的IP地址,记录请求的路径,记录请求的参数等等. 每个系统都会根据自己的需要来记录一些请求相关的日志.一般会将记录的日志信 ...
- 项目开发中Maven的单向依赖-2022新项目
一.业务场景 工作多年,在真实的项目开发中经常会遇到将一个项目拆分成多个工程的情况,比如将一个真实的项目拆分成controller层,service层, dao层,common公共服务层等等.这样拆分 ...
- Java中list集合自定义排序-2022新项目
一.业务场景 为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据.对这些 从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去 ...
- redis缓存恢复-2022新项目
一.业务场景 Web项目开发中,为了加快数据处理的的效率,大量的使用了各种缓存,缓存技术主要使用的是redis.导致出现的小小的 问题是对redis缓存形成了一个比较强的依赖,并且有的数据暂时是没有同 ...
- 程序包 applets.user.service.UserService 不存在-2022新项目
一.问题由来 接上一篇文章使用maven进行打包时报中文乱码错误,经过多次尝试后最终解决问题,显示出真正的错误信息如下: 程序包 applets.user.service.UserService 不存 ...
- git实战-多分支开发-2022新项目
现在开发中大多数公司中都在使用Git这个代码版本管理工具,几乎可以说是已经成为标配,刚入职不久的这家新公司也不例外. 去公司没多久,开始搭建项目,然后创建开发分支,有多少个后端人员就创建多少个开发分支 ...
- 无法访问mybatis.dto.StudengInVO-使用maven编译报错-2022新项目
一.问题由来 最近一次拉代码后,合并代码然后进行编译时出现一个问题,使用maven在进行编译的时候报一个错,无法访问mybatis.dto.StudengInVO. 突然出现这个错误让自己感觉很奇怪, ...
- MYSQL数据去重与外表填充
经常要对数据库中的数据进行去重,有时还需要使用外部表填冲数据,本文档记录数据去重与外表填充数据. date:2016/8/17 author:wangxl 1 需求 对user_info1表去重,并添 ...
随机推荐
- yum源更换/新
参考:https://www.cnblogs.com/opsprobe/p/10673031.html
- while循环结构
一.循环: 1.场景: ①.用户名和密码,反复输入 ②.计算1-100之间 ③.游戏,重生 ④.-- 2.方式 ①.while ②.for 3.while格式 while 条件:要循环执行的代码 布尔 ...
- 商户编号[Merchant Id]是什么
1. Merchant Id是什么 2. Merchant Id 是有哪几个部分构成的 2.1 收单机构代码 2.2 商户地区代码 2.3 Merchant Category Code(MCC) 本文 ...
- ESXI系列问题整理以及记录——使用Windows PowerShell中的SSH功能连接ESXI控制台
首先进入ESXI管理页面,开启ESXI的SSH功能 接下来到位于同一局域网的Win主机上开启Powershell,如果ESXI主机的IP地址为192.168.1.77,则在Powershell中输入: ...
- 从局部信息推测基恩士的Removing BackGround Information算法的实现。
最近从一个朋友那里看到了一些基恩士的资料,本来是想看下那个比较有特色的浓淡补正滤波器的(因为名字叫Shading Correction Filter,翻译过来的意思有点搞笑),不过看到起相关文档的附近 ...
- 【Spring】事务的执行原理(二)
前置知识 事务的执行步骤如下: 获取事务管理器 创建事务 执行目标方法 捕捉异常,如果出现异常进行回滚 提交事务 public abstract class TransactionAspectSupp ...
- SAP 动态选择屏幕实例
DATA:BEGIN OF gs_sel, werks TYPE marc-werks, "工厂 matnr TYPE mara-matnr, "物料 mtart TYPE mar ...
- Arrays.asList的使用
Arrays.asList的作用是将数组转化为list,一般是用于在初始化的时候,设置几个值进去,简化代码,省去add的部分. 示例: List<String> menuList = Ar ...
- Halcon 条形码识别
read_image (Image, 'C:/Users/HJ/Desktop/test_image/image.png') create_bar_code_model([], [], BarCode ...
- SuperSocket 1.6 创建一个简易的报文长度在头部的Socket服务器
我们来做一个头为6位报文总长度,并且长度不包含长度域自身的例子.比如这样的Socket报文000006123456. 添加SuperSocket.Engine,直接使用Nuget搜索SuperSock ...