首页 > 数据库 >postgresql使用group by进行数据去重-2022新项目

postgresql使用group by进行数据去重-2022新项目

时间:2022-08-21 11:44:31浏览次数:60  
标签:postgresql 查询 link 2022 group 主键 id ID

一、业务场景

  数据去重是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,查询,link,2022,group,主键,id,ID
From: https://www.cnblogs.com/yilangcode/p/16609714.html

相关文章

  • 2022年8月21日之人生感悟
      有时想想,我的童年挺幸福的,有最喜欢看的书,只要我想看书,妈妈都会给我买,我想吃的都买给我了,每次回家都会做我最爱吃的菜;每次都记得我喜欢吃什么。母亲和姥姥,爷爷,每次不管......
  • 2022年8月21日周六总结(maven install和package的区别未完成)
    最近做了nexus的配置,突然发现maven也很重要,我们平时会在idea用到clear、install、package等,package毫无疑问就是打包jar包了(在maven中定义了),这个打包会把 最近:这里记录......
  • 2022.8.20 线程通信问题与线程池
    7、线程通信问题生产者消费者模式的问题应用场景︰生产者和消费者问题假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库﹐消费者将仓库中产品取走消费﹒如果仓......
  • 2022.8.20 线程状态
    5、线程状态1.线程五大状态: 2.线程方法2.1停止线程案例packagecom.xing.demo03;/***测试stop*1.建议线程正常停止-->利用次数,不建议死循环*2.建......
  • 2022.8.20 线程同步
    6、线程同步1.介绍多个线程操作同一个资源     由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中......
  • 2022.8.20 线程简介与三种创建方式
    1、线程简介1.多任务   现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上我们的大脑在同一时间依旧只做了一件事情。2.多线程   ......
  • 2022.8.20 Lamda表达式与静态代理
    3、Lamda表达式λ希腊字母表中排序第十一位的字母,英语名称为Lambda避免匿名内部类定义过多其实质属于函数式编程的概念去掉了一堆没有意义的代码,只留下核心......
  • 2022 Java 企业面试题汇总
    Java基础部分请列举至少三个JDK安装目录下的课程性程序(javac)请分析命题:“Java采用自动垃圾回收技术(GC),因此不会出现内存泄露”简单描述单子模式(单例模式)的各种不同实......
  • 2022 8 20
    题1:https://www.lanqiao.cn/problems/504/learning/没有考虑单词相等的情况:(x)importosimportsysinputWord=input()maxLetter=0forletterininputWord:cou......
  • hdu2022多校9
    A.ArithmeticSubsequence注意到等差数列加减乘除上同一个数仍是等差数列,这为分治提供了可能把所有数按奇偶分开,那么不会有跨过两边的等差数列。把偶数除以\(2\),奇数减......