SQL 分组条件深入剖析

news2024/9/22 13:45:55

问题

在 stackoverflow 网站上看到这样一个 SQL 分组条件的需求,需求看似挺简单,但能把 SQL 写正确对于新手来说也不容易,我们拿过来深入剖析一下,数据如下:

需求是查找只有Ready 状态的设备。

解答

自然思路:按设备分组,选出Ready状态个数等于所有状态个数的设备组

拆解思路:

1、 按设备分组

2、 计算出每个设备组下Ready状态个数c1

3、 计算出每个设备组下所有状态个数c2

4、 选出状态个数c1等于c2的设备;

思路图:

试写SQL一:

select t1.device

from

(select device, count(status) as c1

from t

where status='Ready'

group by device) t1

join

(select device, count(status) as c2

from t

group by device) t2

on t1.device=t2.device

where t1.c1=t2.c2

这个实际的思路变成了:

1、 按设备分组,找到每个设备下Ready的个数c1;

2、 按设备分组,找到每个设备下所有状态的个数c2;

3、 把两个分组结果通过设备连接到一起;

4、 在连接到一起结果里,查找c1等于c2的设备。

试写SQL二:

select device

from t

group by device

having sum(case when status = 'Ready' then 1 else 0 end) = count(device);

这个实际思路,倒是和期望的自然思维更近了些,但计算设备中Ready状态个数c1时,没有找到太简单的表述方式,采用了一个变通的复杂思路:

1、隐含着增加一个计算字段,状态为Ready时,这个计算字段为1,否则为0;

2、然后对这个计算字段求和,这个和是Ready状态的个数。

上面我试了两种SQL,虽然结果都对,但竟然难以找到和自然思路一致的写法。面对这种局面,我们不能只是满足于SQL老手对新手的炫技;要更深入的思考SQL语言体系到底缺失了什么根本概念?才导致自然而然的解题思路,能说的出,想得明白,但就是写不出相应的计算机语言。

先直接看一下集算器SPL语言的解法:

A

1

=connect("mysqlDB")

2

=A1.query(“select * from t”)

3

=A2.group(device)

4

=A3.select(~.select(status=="Ready").len()==~.len())

5

=A1.close()

A2从数据库把数据取出来

A3按设备分组,观察一下结果,就只是把数据分成了5组,第一组点进去,能看到有3条符合条件的记录,这一步仅仅做单纯分组,没有其它任何操作:

A4外层select函数里的~符号代表的就是当前设备的组;~.select(status=="Ready").len()就是当前设备下Ready状态个数c1;~.len()是当前设备所有状态的个数 c2;这时最外层 select 变成 A3.select(c1==c2), 也就是自然思路里的第四步:选出状态个数c1等于c2的设备。

完全符合人的自然思维!编码过程顺畅自然,两点之间,直线最短,不用再通过各种“高级技巧”的等价思路绕弯了。

追根溯源,上面 SQL 反映出来的问题,它缺少单纯的分组动作,不能显式的表达每个小分组,进而对每个小分组的更细致操作就无法直观表达。

SQL不提倡分步解决问题、对集合操作支持不彻底、多余的生造出 HAVING 人为的导致概念复杂化;这一系列设计上的缺陷,造成了 SQL 的编写、维护、性能调优都成倍的增加工作量。

集算器的 SPL 语言从根源上弃用了 SQL 背后的关系代数理论,发明新的离散数据集理论解决程序员描述计算的困难。这里有更多 SQL 难点的分析文章:

乾学院 -SPL-SQL 难点

快速上手试试:

下载集算器

如何免费使用润乾集算器

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

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

相关文章

寅辞旧岁,卯定常虹丨ASKO洗碗机“净”护新春团圆时刻

农历新年是一年中最重要的节日,但过去三年的特殊时光阻碍了很多人的归乡之行,如今当阴霾逐渐散去,必然会引来大规模的新年归乡潮,奔赴一个久违的团圆年。美馔佳宴是新春佳节的永恒命题,新年家里少不了亲友的光临&#…

Windows 7的最后一个版本

前天推送的文章介绍了,在1月10日微软发布了最后一个补丁后,微软为Windows7提供的所有更新(包括收费的ESU)已经完全终止。以后再有新的补丁,则为第三方平台提供的非官方版的了。 早在2022年9月份,微软就发布了支持安全启动UEFI的补…

DocPrompt代码实现与模型微调

数据预处理阶段 PaddleOCR PP-Structure:这个库其实是用于版面分析的一个开源库,参见:github: Layout-Parser/layout-parserhttps://github.com/Layout-Parser/layout-parser 代码推理阶段 Paddle-Inferencehttps://paddle-inference.readt…

图形编辑器:工具管理和切换

大家好,我是前端西瓜哥。今天我们看看对于一款图形编辑器,应该怎么去实现工具,比如绘制矩形、选中工具,以及如何去管理它们的。 项目地址,欢迎 star: https://github.com/F-star/suika 线上体验&#xff1a…

【改进篇】Python实现VRP常见求解算法——蚁群算法(ACO)

基于python语言,实现经典蚁群算法(ACO)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数 目录往期优质资源1. 适用场景2. 改进效果对比2.1实验结果2.2 改进前后算法性能对比3. 求…

臻图信息构建数字孪生港口船舶停靠管理系统,赋能港口创新发展

我国的港口不仅是船只停靠的避风港,也是现代渔业发展和管理的中心。随着国内港口业的不断发展,国务院在《现代综合运输体系发展“十四五”规划》中提出,要自动化、数字化、智能化等技术来完善监管体系建设。 ​ 随着科技兴港战略的提出&…

“零”代码改动,静态编译让太乙Stable Diffusion推理速度翻倍

作者|梁德澎 AI 作图领域的工具一直不尽人意,直到去年 8 月 Stable Diffusion 开源,成为AI 图像生成领域无可争辩的划时代模型。 为了提升其推理效率,OneFlow 首度将 Stable Diffusion 模型加速至“一秒出图”时代,极…

2023牛客寒假算法基础集训营2(11/12)

Tokitsukaze and abn (easy)Tokitsukaze and abn (medium)要使abn&#xff0c;那么转换一下就是bn-a&#xff0c;所以只需要计算[n-L,n-R]和[L,R]相交的部分即可AC代码&#xff1a;#include <bits/stdc.h> using namespace std; using LL long long; int main() {ios::s…

6. 基本数据类型

1. Python 中的变量不需要声明 每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。在 Python 中&#xff0c;变量就是变量&#xff0c;它没有类型&#xff0c;我们所说的"类型"是变量所指的内存中对象的类型。 counter 100 # 整型 mile…

关于Win11打开文档总是提示“选择一个程序打开”的问题

这边异常情况&#xff1a; 使用的360浏览器下载回来的文档、微信下载回来的文档都会出现标题所说的问题。 问题产生的原因&#xff1a; 初期在重装电脑后&#xff0c;将自带的一些安装系统后的第三方软件卸载掉了&#xff0c;也包括QQ浏览器。 可是在win11默认应用中看到了…

第五章SpringFramework之AOP

文章目录AOP概念及相关术语概述为什要用 AOP相关术语横切关注点Advice通知Join Point连接点Point CUT 切入点切面目标代理基于注解的SpringAOP准备工作切入点表达式语法重用切入点表达式对应的切面前置通知返回通知异常通知后置通知环绕通知切面的优先级总结Spring AOP 的实现步…

27.Isaac教程--局部建图

26.Isaac教程-局部建图 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 局部地图是机器人周围直接环境的基于网格的简化表示。 这些简化的世界表示对于安全地规划机器人附近的静态和动态障碍物至关重要。 局部建图管道将来自连接到机器人的不同传…

信息服务上线渗透检测网络安全检查报告和解决方案2(安装文件信息泄漏、管理路径泄漏、XSS漏洞、弱口令、逻辑漏洞、终极上传漏洞升级)

系列文章目录 信息服务上线渗透检测网络安全检查报告和解决方案 文章目录系列文章目录前言一、XSS漏洞漏洞危害解决方案1.参数过滤2.Cookie设置HttpOnly二、安装文件目录信息泄漏漏洞证明解决方案三、后台管理路径泄漏、暴力破解、明文传输漏洞证明解决方案四、逻辑漏洞漏洞验证…

LINUX学习之文件处理常用命令(三)

ls 命令描述 ls命令是linux系统中用来列出文件和目录的常用命令&#xff0c;它可以显示文件和目录的名称、权限、大小、修改时间等信息 以下是ls命令的常用参数: -a &#xff1a;列出全部的文件&#xff0c;连同隐藏文件-d &#xff1a;仅列出文件目录&#xff0c;而不是列…

【K哥爬虫普法】辛苦钱被中间商抽走八成,还因此锒铛入狱

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K 哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…

【Python百日进阶-数据分析】Day229 - plotly的动画

文章目录一、动画1.1 基本动画1.2 使用 Plotly Express 制作动画条形图1.3 当前动画限制和注意事项二、为动画添加控制按钮2.1 简单的播放按钮2.2 曲线上的移动点2.3 沿平面曲线移动 Frenet 框架2.4 使用滑块和按钮三、MRI 体积切片的可视化一、动画 使用 Plotly Express 制作…

23种设计模式(九)——抽象工厂模式【对象创建】

文章目录 意图什么时候使用抽象工厂真实世界类比解决方案抽象工厂模式的实现抽象工厂模式的优缺点亦称: Abstract Factory 意图 抽象工厂是创建型设计模式,它强调了一系列相关产品对象(属于同一个产品族)的创建过程,它和工厂方法模式的侧重点不同,工厂方法模式更加侧重于…

JUC面试(四)——ABA问题

ABA问题 从AtomicInteger引出下面的问题 CAS -> Unsafe -> CAS底层思想 -> ABA -> 原子引用更新 -> 如何规避ABA问题 假设现在有两个线程&#xff0c;分别是T1 和 T2&#xff0c;然后T1执行某个操作的时间为10秒&#xff0c;T2执行某个时间的操作是2秒&#…

Python---人生重开模拟器(简版)

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 人生重开模拟器思维导图前言一、设置初始属性1.…

〖百宝书-思维锻炼③〗——三心理论——成功的来源

大家好&#xff0c;我是涵子&#xff0c;今天我们来聊聊三心理论。 &#x1f4ac; 人生格言&#xff1a;Stay foolish, stay kind.&#x1f4ac; &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &a…