MS SQL Server 实战 排查多列之间的值是否重复

 

目录

需求

范例运行环境

数据样本设计

功能实现

上传EXCEL文件到数据库

SQL语句

小结


需求

在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据,主要包括题目和选项字段(如单选选择项或多选选择项) ,一个合理的数据存储应该保证这些选项列之间不应该出现重复项目数据,比如选项A不应该和选项B的值重复,选项B不应该和选项C的值重复,以此穷举类推,以保证这些选项之间不会出现重复的值。本文将介绍如何利用 group by  、having 语句来实现这一需求,主要实现如下功能:

(1)上传 EXCEL 版试题题库到 MS SQL SERVER 数据库进行导入

(2)通过 union all  将各选项列的数据进行 转记录行的合并

(3)通过 group by 语句 和 count 聚合函数统计重复情况

(4)通过 having 子句筛选出重复记录

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

.netFramework 4.7.2

数据样本设计

假设有 EXCEL 数据题库如下:

如图我们假设设计了错误的数据源,第4题的A选项与D选项重复,第8题的A选项与C选项重复了。

 

题库表 [exams] 设计如下:

序号字段名类型说明备注
1sortidint排序号题号,唯一性
2etypenvarchar试题类型如多选、单选
3etitlenvarchar题目
4Anvarchar选项A
5Bnvarchar选项B
6Cnvarchar选项C
7Dnvarchar选项D

功能实现

上传EXCEL文件到数据库

导入功能请参阅我的文章《C#实现Excel合并单元格数据导入数据集》这里不再赘述。

SQL语句

首先通过 UNION ALL 将A到D的各列的值给组合成记录集 a,代码如下:

	select A as item,sortid from exams  union allselect B as item,sortid from exams  union allselect C as item,sortid from exams  union allselect D as item,sortid from exams  

其次,通过 group by 对 sortid (题号) 和 item (选项) 字段进行分组统计,使用 count 聚合函数统计选项在 题号 中出现的个数,如下封装:

select item,count(item) counts,sortid from (select A as item,sortid from exams  union allselect B as item,sortid from exams  union allselect C as item,sortid from exams  union allselect D as item,sortid from exams  
) a group by sortid,item order by sortid

最后使用 having 语句对结果集进行过滤,排查出问题记录,如下语句:

select item,count(item) counts,sortid from (select A as item,sortid from exams  union allselect B as item,sortid from exams  union allselect C as item,sortid from exams  union allselect D as item,sortid from exams  
) a group by sortid,item   having count(item)>1 order by sortid

在查询分析器运行SQL语句,显示如下图:

由此可以看出,通过查询可以排查出第4题和第8题出现选项重复问题。 

小结

我们可以继续完善对结果的分析,以标注问题序号是哪几个选项之间重复,可通过如下语句实现:


select case when A=item then 'A' else ''end+
case when B=item then 'B' else '' end +
case when C=item then 'C' else '' end +
case when D=item then 'D' else '' end tip
,b.* from  
(select item,count(item) counts,sortid from (select A as item,sortid from exams  union allselect B as item,sortid from exams  union allselect C as item,sortid from exams  union allselect D as item,sortid from exams  
) a group by sortid,item   having count(item)>1 ) b,exams c where b.sortid=c.sortid

关键语句:case when A=item then 'A' else ''end+
case when B=item then 'B' else '' end +
case when C=item then 'C' else '' end +
case when D=item then 'D' else '' end tip

这个用于对比每一个选项列,得到对应的选项列名,运行查询分析器,结果显示如下:

这样我们可以更直观的看到重复的选项列名是哪几个,以更有效帮助我们改正问题。在实际的应用中每一个环节我们都难免会出现一些失误,因此不断的根据实际的发生情况总结经验,通过计算来分析,将问题扼杀在摇篮里,以最大保证限度的保证项目运行效果的质量。

至此关于排查多列之间重复值的问题就介绍到这里,感谢您的阅读,希望本文能够对您有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32的寄存器深度解析

目录 一、STM32 寄存器概述 二、寄存器的定义与作用 三、寄存器分类 1.内核寄存器 2.外设寄存器 四、重要寄存器详解 1.GPIO 相关寄存器 2.定时器相关寄存器 3.中断相关寄存器 4.RCC 相关寄存器 五、寄存器操作方法 1.直接操作寄存器 2.使用库函数操作寄存器 六…

数字高程模型DEM详细应用分析

DEM在各个领域都有广泛应用,它不仅仅是一张“高程地图”,更是地理分析、模拟和预测的重要工具。 一、地形分析 在地形分析中,DEM是不可或缺的工具. 1 坡度分析(Slope Analysis) 定义:坡度是指地形表面的…

go语言的基本语法

学了go语言但是一直没整理。。。那怎么证明我学了?如果学了之后忘了怎么复习?遂诞生这几篇,当作Linux中间的小插曲 整理一下go语言的基本语法: package mainimport ("bufio""fmt""os" ) 在使用对…

模拟退火算法(SA算法)求解实例---旅行商问题 (TSP)

目录 一、采用SA求解 TSP二、 旅行商问题2.1 实际例子:求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏(后续和其他算法进行对比) 三、 如何修改代码?3.1 减少城市坐标,如下&am…

文件格式转换:EXCEL和CSV文件格式互相转换

目录 1.EXCEl和CSV文件格式互相转换1.1首先安装所需的Python包1.2excel转换为csv代码如下:1.3csv转换为excel代码如下: 由于excel文件在数学建模数据处理当中的局限性,我们通常把excel文件转换为csv文件来处理,下面是相关的代码&a…

用网卡的ap模式抓嵌入式设备的网络包

嵌入式设备不像pc上,有一些专门的工具比如wareshark来抓包,嵌入式设备中,有的可能集成了tcpdump,可以用来进行简单的抓包,但是不方便分析,况且有的嵌入式设备不一定就集成了tcpdump工具。 关于tcpdump工具…

Hibernate基础

Hibernate基础总结 有利的条件和主动的恢复产生于再坚持一下的努力之中! 好久没更新了,今天入门了Hibernate,由于之前学习了MyBatis,初步感觉二者的底层实现思想有很多相似之处,下面让我们以一个入门Demo的形式感受一…

AIGC实战——多模态模型Flamingo

AIGC实战——多模态模型Flamingo 0. 前言1. Flamingo 架构2. 视觉编码器3. Perceiver 重采样器4. 语言模型5. FIamingo 应用小结系列链接 0. 前言 我们已经学习了文本生成图像模型 DALL.E 2,在本节中,我们将探索另一种多模态模型 Flamingo,它…

Docker上安装mysql

获取 MySQL 镜像 获取镜像。使用以下命令来拉取镜像: 1docker pull mysql:latest 这里拉取的是最新版本的 MySQL 镜像。你也可以指定特定版本,例如: 1docker pull mysql:8.0 运行 MySQL 容器 运行 MySQL 容器时,你需要指定一些…

redis基本数据结构-hash

这里写自定义目录标题 1. redis的数据结构hash1.1 Hash 数据结构的特点1.2 常见命令1.3 适用示例 2. 常见业务场景2.1 用户信息存储2.1.1 场景2.1.2 优势2.1.3 解决方案2.1.4 代码实现 2.2 购物车管理2.2.1 背景2.2.2 优势2.2.3 解决方案2.2.4 代码实现 3. 注意事项&#xff1a…

USB的电气特性

文章目录 一、USB的三种速率及状态切换图1. **附加(Attached)**2. **供电(Powered)**3. **复位(Reset)**4. **地址设置(Addressed)**5. **配置(Configured)**…

llama网络结构及源码

目录 模型初始化 config lm_head transformer wte h rms_1/rms_2 attn c_attn c_proj 线性层mlp ln_f rope_cache mask_cache kv_caches tokenizer tokenizer初始化 tokennizer.encoder 位置编码和mask 确定最大文本长度 建立rope_cache 建立mask_cache …

C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿&…

ICM20948 DMP代码详解(23)

接前一篇文章:ICM20948 DMP代码详解(22) 上一回解析完了inv_icm20948_wakeup_mems函数,本回回到inv_icm20948_initialize_lower_driver函数中,继续往下解析。为了便于理解和回顾,再次贴出inv_icm20948_init…

闯关leetcode——26. Remove Duplicates from Sorted Array

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/ 内容 Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appear…

Framebuffer应用编程

目录 前言 LCD操作原理 涉及的 API 函数 open函数 ioctl 函数 mmap 函数 Framebuffer程序分析 源码 1.打开设备 2.获取LCD参数 3.映射Framebuffer 4.描点函数 5.随便画几个点 上机实验 前言 本文介绍LCD的操作原理和涉及到的API函数,分析Framebuffer…

Python青少年简明教程:tkinter库入门

Python青少年简明教程:tkinter库入门 tkinter是Python的标准GUI(图形用户界面)库。它提供了一种快速而简单的方法来创建GUI应用程序。tkinter是Python自带的,无需额外安装,随 Python 安装包一起提供。 在Python 3.x中…

rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链

前言 rtems 是一款比较优秀的 RTOS,官方网址 https://www.rtems.org/ 当前 rtems 最新发布的版本:rtems-5.3 版本, 下载地址 https://ftp.rtems.org/pub/rtems/releases/5/5.3/ rtems 支持的 平台也是比较多的,当前支持 STM32F4…

调制是什么,为什么

一、什么是调制、解调? 调制:将信息承载到满足信道要求的高频信号上的过程就是调制。 解调:解调是调制的逆过程,将有用的信息从高频信号中恢复出来的过程就是解调。 二、为什么需要调制? 通信是为了实现“信息”的传…

【自然语言处理】实验三:新冠病毒的FAQ问答系统

目录 前言 1.新建data_process.py 1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件 1.2功能模块2:进行问题/问题列表处理(正则化,分词) 1.3功能模块3:处理输入的问题 1.4功能模块4:计算输入问题与问题…