当前位置: 首页 > 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 …...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

云计算——弹性云计算器(ECS)

弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...