当前位置: 首页 > news >正文

sql 分组讨论,二级分组(非2个字段分组),使用 窗口函数和普通分组实现

1. 二级分组需求

  • 先按照一个字段分组,在按照 第二个字段分组。
  • 之后,如果 这个 二级分组中的数据,是 > 1条的。就筛选出来。

比如:

  • 先按照 站点分组,再按照 设备分组,

  • 即:如果站点上配置了2个设备。就筛选出来。

    • 然后:这2个设备 都必须是屏幕
  • 查出配置了2个设备的站点

SELECTe2.station,e2.device 
FROMesb_config e2 
GROUP BYe2.station 
HAVINGcount( 1 ) > 1
  • 要求 这两个设备都是屏幕,参考SQL和思路1

错误写法

	SELECTe2.station,e2.device FROMesb_config e2GROUP BY e2.station,e2.device HAVING count(*) > 1 -- 这样是错误的,这样是根据2个字段 分组。结果不会存在 > 1的情况
GROUP BY e2.station HAVING count(e2.device) > 1
-- 这样写无异议 等于 HAVING count(e2.station) > 1,也是错误的GROUP BY e2.station
-- 核心是:这样查询后,会随机带出 一个device。
-- 所以哪怕 外层在套一个分组(因为经过一层后,已经选出了一个device了),也是错的。

问题从头整理

表结构和数据

CREATE TABLE `user` (`id` int NOT NULL,`username` varchar(22) DEFAULT NULL,`info` varchar(22) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;1	zhangsan	1
2	lisi	22
3	lisi	33-- 我们要查出lisi
-- 先按照姓名分组,在按照 info 分组。
-- info中的 数据>1,就查询出来
collate/kəˈleɪt/
vt.
核对,校对;校勘

按照username分组

SELECT * 
FROM `user`
GROUP BY username-- 按照username分组后,lisi会随机选一条(第一条)
1	zhangsan	1
2	lisi	22

加入扰乱数据

INSERT INTO `user`(`id`, `username`, `info`) VALUES (4, 'zhangsan', '1');
-- 此时数据的数据为
1	zhangsan	1
2	lisi	22
3	lisi	33
4	zhangsan	1
  • 加条件
SELECT * 
FROM `user`
GROUP BY username
HAVING count(username) > 1-- 结果为:此时zhangsan是info相同的,不应该出现。count(1),或 count(其他值) 结果都一样
1	zhangsan	1
2	lisi	22

两个字段分组 加条件

  • 分3组
-- 此时数据的数据为
1	zhangsan	1
2	lisi	22
3	lisi	33
4	zhangsan	1SELECT * 
FROM `user`
GROUP BY username,info-- 根据 两个字段分组,后变成3组
1	zhangsan	1
2	lisi	22
3	lisi	33
  • 此时分组中的数据 > 1的为 zhangsan
SELECT * 
FROM `user`
GROUP BY username,info
HAVING count(1) > 1-- 结果
1	zhangsan	1

2. 业务

真实的问题

  • 业务要求了,必须是 一个站点绑定两个设备都是屏幕,才查询出来。

  • 无用的SQL保存,验证这个真实的设备是不是 屏幕

SELECT* 
FROMdevice d,device_type dt 
WHEREd.deviceType = dt.id AND d.id = 'e696cfeeb4568ccfcda0ae6787388760' AND dt.attribute = '屏幕'

先 where,在 having

  • where语句的执行顺序先于group by,group by语句的执行顺序先于having
    • having 子句中的每一个元素也必须出现在select列表中,
    • having语句可以使用聚合函数。

SQL和实现思路1 窗口函数

SELECT* 
FROM(SELECTe2.station,ROW_NUMBER() OVER ( PARTITION BY e2.station ) row_num FROMesb_config e2,device d,device_type dt WHEREd.deviceType = dt.id AND dt.attribute = '屏幕' AND e2.device = d.id ) t1 
WHEREt1.row_num > 1-- 窗口函数 再次赋值
SELECT* 
FROM(SELECTe2.station,ROW_NUMBER() OVER ( PARTITION BY e2.station ) row_num FROMesb_config e2) t1
WHEREt1.row_num > 1

SQL和实现思路2 分组

  • 查出 站点配置了 多个设备的 站点
SELECTe2.station,e2.device 
FROMesb_config e2 
GROUP BYe2.station 
HAVINGcount( 1 ) > 1
  • 这多个设备 必须是屏幕,才能查出来。
    • 对站点进行了分组:
SELECTe2.station,e2.device 
FROMesb_config e2,device d,device_type dt 
WHEREd.deviceType = dt.id AND dt.attribute = '屏幕' AND e2.device = d.id
-- 上面SQL 查出了配置表中,所有为屏幕的 设备和站点
-- 此时一个站点 如果配置了 多个屏幕,这个站点就会展示出多条-- 然后在筛选一下,站点>1 的
GROUP BYe2.station 
HAVINGcount( 1 ) > 1

扩展怎么显示 一个站点,显示2次呢

  • 思路1再关联原表

  • 使用这个逻辑,有一个问题。怎么显示 一个站点,显示2次呢(设备不同的时候)

    • 很简单,只需要在 外层关联一个 表即可(因为这个表 本来就是这种逻辑,一个站点,显示2次)
SELECT * from esb_config e1, (SELECTe2.station FROMesb_config e2,device d,device_type dt WHEREd.deviceType = dt.id AND dt.attribute = '屏幕' AND e2.device = d.id GROUP BYe2.station HAVINGcount( 1 ) > 1
) t1
WHERE e1.station = t1.station-- 核心是这样的结果
SELECT * from esb_config e1, (SELECTe2.station -- 这里,e2.device 取了没用,只是会筛选第一个 FROMesb_config e2GROUP BYe2.station HAVINGcount( e2.station  ) > 1) t1
WHERE e1.station = t1.station-- 那这个结果加上限制对不对呢?不对的,为啥不对,这里不懂。
-- AND dt.attribute = '屏幕' 

SQL和思路3 错误的

  • 把一级分组,查询出来

  • 把二级分组,查询出来

  • 如果 一级分组 和 二级分组,关联上就展示

  • 这样 查出的数据 只查出了一条(也是上面的 数据之一)

SELECT* 
FROM( SELECT * FROM (SELECTe2.station,e2.deviceFROMesb_config e2,device d,device_type dt WHEREe2.device = d.id AND d.deviceType = dt.id AND dt.attribute = '屏幕') t2GROUP BY t2.station HAVING count(t2.station) > 1 ) t1,(SELECT * FROM (SELECTe2.station,e2.device FROMesb_config e2,device d,device_type dt WHEREe2.device = d.id AND d.deviceType = dt.id AND dt.attribute = '屏幕') t2GROUP BY t2.device HAVING count(t2.device) > 1 ) t3WHEREt1.station = t3.station and t1.device = t3.device

相关文章:

sql 分组讨论,二级分组(非2个字段分组),使用 窗口函数和普通分组实现

1. 二级分组需求 先按照一个字段分组,在按照 第二个字段分组。之后,如果 这个 二级分组中的数据,是 > 1条的。就筛选出来。 比如: 先按照 站点分组,再按照 设备分组, 即:如果站点上配置了…...

业务中如何过滤敏感词

在我们访问网站的时候,如果发现我们发布的内容有色情暴力的东西等等,会屏蔽掉,这种行为就是过滤敏感词。 从技术层面实现起来,其实比较简单,因为我们输入的内容就是一个大型的字符串,我们要调用某些api来判…...

用服务器搭建网站需要做什么

网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。不同领域的网页设计,网页图形设计,界面设计,创作,其中包括标准化的代码和专有软件,用户体验设计和搜索引擎优化。许多人…...

clickhouse 删除操作

OLAP 数据库设计的宗旨在于分析适合一次插入多次查询的业务场景,市面上成熟的 AP 数据库在更新和删除操作上支持的均不是很好,当然 clickhouse 也不例外。但是不友好不代表不支持,本文主要介绍在 clickhouse 中如何实现数据的删除&#xff0c…...

C 语言中,「.」与「->」有什么区别?

使用“.”的话,只需要声明一个结构体。格式是结构体类型名结构体名。然后通过结构体名加上“.”再加上域名,就可以引用结构体的域了。因为结构体的内存是自动分配的,就像使用int a;一样。而使用“->”的话,需要声明一个结构体的…...

github pages 用法详解 发布自己的网站

github pages 基础用法 URL 规则 假设你的 github 帐号为 mygithub,需要发布的仓库名为 myrepo,那么 pages 的 URL 为: https://mygithub.github.io/myrepo 添加内容 用任意编辑器写好(或者生成)标准的网页内容&a…...

坤简炫酷的JQuery轮播图插件

介绍: 找到了一个炫酷的JQuery轮播图插件,只需要配置三四行代码就可以实现很多二维三维炫酷的切换效果。 视频效果及教程: https://www.bilibili.com/video/BV1Fu4y1d776/ 代码: https://github.com/w-x-x-w/AwesomeWeb 使用…...

C# 条件编译

C# 条件编译 C# 条件编译:根据不同的需求,编译生成不同的程序版本,条件编译是一种编译预处理命令,它是在编译代码之前对源代码进行处理。它可以根据条件,决定是否编译某段代码 条件编译的三种形式: 第一种…...

IntelliJ IDEA如何重新弹出git身份验证窗口

1、点击File菜单—>点击Settings—>点击Appearance & Behavior—>点击System Settings—>点击Passwords—>选中Do not save, forget passwords after restart—>点击Apply—>点击OK,如下所示: 2、重启IntelliJ IDEA—>通过g…...

【雕爷学编程】Arduino动手做(200)---WS2812B幻彩LED灯带4

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...

【雕爷学编程】Arduino动手做(201)---DFRobot 行空板03

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...

Spring中Bean的“一生”(生命周期)

文章目录 一、图解二、文字解析总结 一、图解 >注:处于同一行的执行顺序是从左往右 二、文字解析 SpringBean的生命周期总体分为四个阶段:实例化>属性注入>初始化>销毁 Step1 实例化Bean:根据配置文件中Bean的定义,…...

安卓:LitePal操作数据库

目录 一、LitePal介绍 常用方法: 1、插入数据: 2、更新数据: 3、删除数据: 4、查询数据: 二、LitePal的基本用法: 1、集成LitePal: 2、创建LitePal配置文件: 3、创建模型类…...

【JavaEE初阶】了解JVM

文章目录 一. JVM内存区域划分二. JVM类加载机制2.1 类加载整体流程2.2 类加载的时机2.3 双亲委派模型(经典) 三. JVM垃圾回收机制(GC)3.1 GC实际工作过程3.1.1 找到垃圾/判定垃圾1. 引用计数(不是java的做法,Python/PHP)2. 可达性分析(Java的做法) 3.1.2 清理垃圾1. 标记清除2…...

基于vue2.0和elementUi的vue农历日期组件vue-jlunar-datepicker(插件)

vue-jlunar-datepicker(插件) vue实现农历日历插件——vue-jlunar-datepicker插件 这个插件本身是基于vue2.0和elementUi框架来实现的。 安装 vue-jlunar-datepicker 插件 npm install vue-jlunar-datepicker --save // 如果安装过程中,出现…...

Python爬虫——selenium_元素定位

元素定位:自动化要做的就是模拟鼠标和键盘来操作这些元素,点击,输入等等。操作这些元素前首先要找到它们,WebDriver提供很多定位元素的方法 from selenium import webdriver# 创建浏览器对象 path files/chromedriver.exe brows…...

短视频内容平台(如TikTok、Instagram Reel、YouTube Shorts)的系统设计

现在,短视频内容已成为新趋势,每个人都在从TikTok、Instagram、YouTube等平台上消费这些内容。让我们看看如何为TikTok创建一个系统。 这样的应用程序看起来很小,但在后台有很多事情正在进行。以下是相关的挑战: •由于该应用程序…...

【git】Git 回退到指定版本:

文章目录 方法一: 使用 git reset 命令方法二:使用 git revert 命令方法三:使用 git checkout 命令常见的错误及其解决办法如下: 方法一: 使用 git reset 命令 命令可以将当前分支的 HEAD 指针指向指定的提交,从而回退代码到指定版…...

kibana+nginx配置密码 ubuntu

JAVA进阶之路-nginx设置密码 Kibana——通过Nginx代理Kibana并实现登陆认证 需要配置一下nginx文件 nginx配置文件详解 密码生成安装软件 apt install apache2-utils...

Git仓关联多个远程仓路径

前言 Git仓如果需要将代码push到多个仓,常用的做法是添加多个远程仓路径,然后分别push。这样虽然可以实现目的,但是需要多次执行push指令,很麻烦。 本文介绍关联多个远程仓路径且执行一次push指令的方法:git remote …...

【11月16日-大模型前置知识【深度学习】+大模型开发入门】-基础篇笔记

文章目录前言一、huggingface国内1.引入库2.LLM 大模型语言的基础知识:2.LLM主要类别架构介绍3.卷积神经网络CNN4.循环神经网络总结全文通俗总结一、入门工具:Hugging Face二、LLM底层核心:语言模型的进化三、主流LLM架构大盘点四、深度学习基…...

AI原生不是口号,是生存——SITS2026系统改造的12项不可妥协技术红线(附银保监科技评估组密级评审意见节选)

第一章:AI原生不是口号,是生存——SITS2026系统改造的12项不可妥协技术红线(附银保监科技评估组密级评审意见节选) 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026核心系统重构中,“AI原生”已非架构选型偏…...

嵌入模型的维度幻觉:生产级RAG系统记忆的几何学边界

在构建企业级RAG系统或长期运行的AI Agent时,绝大多数架构师都默认一个前提:把文本切成向量,扔进384维、768维甚至1024维的嵌入空间,检索时靠余弦相似度,就能实现“接近人类”的长期记忆能力。随着数据库不断增长&…...

【研报300】长安猎手增程式皮卡前后桥动传系统解读:快速量产的动传系统设计

本报告提供限时下载,请查看文后提示以下仅为报告部分内容:摘要:长安猎手增程式皮卡的前后桥动传系统,采用基于燃油皮卡底盘的改造方案,前桥通过电机传动轴复用成熟燃油车桥,后桥采用偏置同轴电驱桥&#xf…...

【OpenClaw】通过 Nanobot 源码学习架构---()总体刎

核心摘要:这篇文章能帮你 ?? 1. 彻底搞懂条件分支与循环的适用场景,告别选择困难。 ?? 2. 掌握遍历DOM集合修改属性的标准姿势与性能窍门。 ?? 3. 识别流程控制中的常见“坑”,并学会如何优雅地绕过去。 ?? 主要内容脉络 ?? 一、痛…...

Qwen3.5-9B问题解决:部署常见错误排查与日志查看指南

Qwen3.5-9B问题解决:部署常见错误排查与日志查看指南 1. 部署前环境检查 1.1 硬件要求确认 在部署Qwen3.5-9B模型前,请确保您的硬件环境满足以下最低要求: GPU:NVIDIA显卡,显存≥24GB(推荐RTX 3090/409…...

AI大模型岗位全解析:小白也能入行的收藏指南!

本文全面解析AI大模型行业岗位,涵盖核心技术岗(高薪、高壁垒)、工程与平台岗(落地关键、需求大)、产品与应用岗(懂业务、好入行)以及入门与服务岗(零基础友好)。详细介绍…...

5个内容访问解决方案:突破数字阅读限制的非技术人员实践指南

5个内容访问解决方案:突破数字阅读限制的非技术人员实践指南 在信息爆炸的时代,优质内容往往被付费墙阻隔,成为知识获取的障碍。本文将系统解析内容访问限制的技术原理,对比5种主流内容访问解决方案的适用场景与实施难度&#xff…...

Honey Select 2游戏体验终极优化指南:HS2-HF_Patch完整解决方案

Honey Select 2游戏体验终极优化指南:HS2-HF_Patch完整解决方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 当你打开Honey Select 2时&#xff…...

从夯到拉,锐评大模型岗位!收藏这份进阶指南,小白程序员也能抓住AI红利!

本文详细解析了大模型领域的不同岗位,从底层架构的夯岗位到应用开发的拉岗位,涵盖了预训练工程师、Infra工程师、基座模型优化、后训练、多模态、应用开发工程师、数据工程师、风控/安全、模型评估和Prompt工程师等。文章强调了当前大模型领域的人才缺口…...