MySQL多列字段去重的案例实践

news2024/12/23 17:36:26

同事提了个需求,如下测试表,有code、cdate和ctotal三列,

select * from tt;

在这里插入图片描述

现在要得到code的唯一值,但同时带着cdate和ctotal两个字段。

提起"唯一值",想到的就是distinct。distinct关键字可以过滤多余的重复记录只保留一条。

distinct支持单列去重和多列去重,如果是单列去重,简明易懂,即相同值只保留1个,如下所示,

select distinct code from tt;

在这里插入图片描述

多列去重则是根据指定的去重列信息进行,即只有所有指定的列信息都相同,才会被认为是重复的信息,如下所示,code、cdate和ctotal都相同,才会返回记录,因此不是字面上的理解,即只要code是distinct的,cdate和ctotal无需关注。实际上当distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧贴着它的一个字段,即distinct同时作用了三个字段,code、cdate和ctotal,并不只是code字段,

select distinct code, cdate, ctotal from tt;

在这里插入图片描述

而且distinct只能放到所有字段的前面,如果像这种,distinct之前有其它字段,则会提示错误,

select cdate, ctotal, distinct code from tt;

SQL 错误 [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'distinct code from tt' at line 1

但是如上SQL使用distinct关键字,并没有满足需求,即得到code的唯一值,但同时带着cdate和ctotal两个字段,可以看到有很多相同的code。

除了distinct,group by子句也可以去重,从需求的理解上,如果按照code做group by,应该就可以得到唯一的code了,但是实际执行,提示这个错误,

select code, cdate, ctotal from tt group by code;

SQL 错误 [1055] [42000]: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.tt.code' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

很常见的错误,因为sql_mode中含only_full_group_by规则,

show variables like '%sql_mode%';

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

only_full_group_by规则是指对group by进行查询的SQL,不允许select部分出现group by中未出现的字段,也就是select查询的字段必须是group by中出现的或者使用聚合函数的,即校验更加严格。

P.S. MySQL不同版本sql_mode默认值可能是不同的,因此在数据库升级配合的应用迁移过程中,尤其要注意像only_full_group_by这种校验规则的改变,很可能是个坑。

仅针对当前这个问题,可以在会话级,修改sql_mode,调整校验的强度,删除only_full_group_by,

set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

此时,使用group by,

select code, cdate, ctotal from tt group by code;

就可以得到想要的效果了,
在这里插入图片描述

除了group by,还可以使用group_concat函数,配合distinct,达到相同效果。

我们分解来做,可以看到group_concat(code),得到的是所有记录的code值拼接成新字段,

select group_concat(code), cdate, ctotal from tt group by code;

在这里插入图片描述
group_concat中加上distinct,就可以过滤所有的重复值,满足了需求,

select group_concat(distinct code), cdate, ctotal from tt group by code;

在这里插入图片描述

当然,这种在会话级通过改动sql_mode实现的路径,还需要考虑场景,因为缺少only_full_group_by的校验,按照code聚类了,但cdate和ctotal的值很可能是不唯一的,返回的结果,只能准确描述code的数据情况,不能代表cdate和ctotal的真实数据情况。因此,任何方案的选择,都需要结合实际的场景需求,我们找的方案,不一定是最好的,但需要最合适的。

本文关键字:#SQL# #去重#

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

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

相关文章

Machine Learning-Ex8(吴恩达课后习题)Anomaly Detection and Recommender Systems

1. Anomaly detection 内容:使用高斯模型来检测数据集中异常的数据(概率低的),先在2维数据中进行实验。样本具有两个特征:a. 服务器响应的吞吐量(mb/s) b. 延迟(ms)。 …

【linux网络】正则表达式

一、正则表达式 1.1作用范围 通常用于判断语句中,用来检查某一个字符串是否满足某一格式 1.2正则表达式的组成 普通字符包括大小写字母、数字、标点符号及其它符号元字符元字符是指在正则表达式中具有特殊意思的专用字符,可以用来规定其导字符&#…

【P18】JMeter JSON JMESPath Extractor

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜: http://111.231.103.117/#/login 进入网页后,登录,页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12,打开调试工具,点击搜索 二、测试计划设…

Bean的存取、五大注解、对象的注入方式、Bean的作用域和生命周期

一、Bean 的创建、存储和使用 PS:Java语言中的对象也叫作 Bean。 1、创建一个maven项目 PS:要在 pom.xml 中添加 spring 框架支持 PS:引入 lombok 依赖(可以帮助实现 get 和 set 方法) 2、存对象 2.1、创建类 启…

Linux 蜂鸣器驱动实验

蜂鸣器驱动原理 ①、在设备树中添加 SNVS_TAMPER1 引脚的 pinctrl 信息。 ②、在设备树中创建蜂鸣器节点,在蜂鸣器节点中加入 GPIO 信息。 1、修改设备树文件 添加 pinctrl 节点 I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1这个PIN,打开imx6ull-alien…

【01】C++的第一个程序Hello World

C的第一个应用程序(Hello World程序) 引言一、代码二、代码解释三、注意事项总结 引言 💡 作者简介:专注于C/C高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。 👉 &#x1f39…

报表生成工具Stimulsoft Reports.JS如何减少产品脚本的加载时间

Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…

Django框架之视图HttpResponse 对象

本篇文章主要内容为:视图中HttpResponse对象的属性、方法及json、redirect子类包含使用cookie使用、跳转、json返回的示例。 概述 HttpResponse对象是对用户访问的响应,与HttpRequest对象由django创建,HttpResponse对象是由开发人员创建。Ht…

001+limou+MySQL的基础命令

0.前言 您好,这里是limou3434的一篇个人博文,感兴趣的话您也可以看看我的其他文章。本博文是借鉴于李小威前辈所著的书籍《SQL 基础教程》所成的博文笔记,这本书真的很适合新手学习数据库相关的内容。本次我想给您带来的是关于MySQL的一些基…

网站神奇工具Viewport Resizer,支持手机、pad和电脑等不同尺寸大小

标题:Viewport Resizer:让网站适应不同设备的神奇工具! 导语: 在互联网世界中,我们常常需要在不同设备上浏览网站。为了让用户在手机、平板或电脑上都能看到美观易用的页面,网站开发者们努力优化网站的适应…

qemu-虚拟机

qemu 官网下载地址 https://www.qemu.org/ 跨平台虚拟机,类型vmware,执行效率比vmware高 官方参考文档:https://www.qemu.org/docs/master/system/introduction.html kvm,轻量级虚拟机,可以加速qemu的执行 qemu-e…

微信云开发技术架构

(仅有把抱怨环境的情绪,化为上进的力量,才是成功的保证。——罗曼罗兰) 微信云开发 官方文档 文本只用来概述微信云开发的技术架构,并结合实战场景进行说明。更详细的请直接查看微信官方文档。 背景 微信云开发是微…

Oracle11g全新讲解之游标

游标 游标的作用:处理多行数据,类似与java中的集合 1.隐式游标 一般是配合显示游标去使用的,不需要显示声明,打开,关闭,系统自定维护,名称为:sql 常用属性: sql%found:语句影响了…

快速分隔文件(split),合并文件(paste)的命令;eval(先扫描输出在执行)命令

split快速分割文件,paste快速合并文件;eval命令 split命令快速分隔文件paste命令快速合并文件eval命令 split命令快速分隔文件 语法格式: split 【选项】 参数 原始文件 拆分后文件名前缀 常用选项 -l:以行数拆分 -b&#xf…

7.对象模型

对象模型 信号和槽 信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知,槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击],它会发出一个信号[clicked()],然后与该对象连接的槽函数将被自动调用。 若某个信号与多…

图像分割之SAM(Segment Anything Model)

论文:Segment Anything Github:https://github.com/facebookresearch/segment-anything 论文从zero-shot主干网络的基础出发,提出了SAM(Segment Anything Model)模型。该模型有别于传统的分割模型。传统分割模型只能输…

正则表达式的一些元符号

正则表达式 正则表达式—通常用于判断语句中,用来检查某一字符串是否满足某一格式 正则表达式是由普通字符与元字符组成 普通字符包括大小写字母、数字、标点符号及一些其他符号元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字…

(数字图像处理MATLAB+Python)第四节:频域高通滤波与综合案例

文章目录 一:频域高通滤波(1)理想的高通滤波器(2)巴特沃斯高通滤波器(3)指数高通滤波器(4)梯形高通滤波器 二:综合案例——人像美化(1&#xff09…

vue2实现高德地图 JSAPI 2.0海量点标记(标注和标注图层)->自定义点位->定时刷新点位

前提: 需要注册高德开放平台,之后创建应用并且开通Web端(JS API)平台,然后拿到securityJsCode和key 1. 基础抽取(还原示例) 1.1 组件代码 代码说明: 需要修改securityJsCode和key为自己的allowCollision为标注是否避让marker,默认为false不避让markers为地图上的标记数组layer…

【Axure教程】中继器表格寻找和标记数据

在系统表格中,我们想在表格中快速找到对应的数据,通常我们会用条件筛选来完成,但是用筛选的方式,其他数据就看不到了,少了两种条件之间的对比。所以如果需要数据对比的情况下,我们更多的是用标记数据的方式…