思路解析:第一性原理解 SQL:连接(JOIN)
目录
题目描述
🎯 应用第一性原理来思考这个 SQL 题目
✅ 第一步:还原每个事件的本质单位
✅ 第二步:如果一个表只有事件,如何构造事件对?
✅ 第三步:加过滤条件,只保留“同一机器、同一进程”的行组合
✅ 第四步:再过滤,只保留从 start 到 end 的方向
✅ 第五步:思考目标层级 —— 我们要“按机器”聚合
✅ 最后一步:结构简化为计算表达式
🎓 小结:SQL 中的第一性原理套路
题目描述
表: Activity
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| machine_id | int |
| process_id | int |
| activity_type | enum |
| timestamp | float |
+----------------+---------+
该表展示了一家工厂网站的用户活动。
(machine_id, process_id, activity_type) 是当前表的主键(具有唯一值的列的组合)。
machine_id 是一台机器的ID号。
process_id 是运行在各机器上的进程ID号。
activity_type 是枚举类型 ('start', 'end')。
timestamp 是浮点类型,代表当前时间(以秒为单位)。
'start' 代表该进程在这台机器上的开始运行时间戳 , 'end' 代表该进程在这台机器上的终止运行时间戳。
同一台机器,同一个进程都有一对开始时间戳和结束时间戳,而且开始时间戳永远在结束时间戳前面。
现在有一个工厂网站由几台机器运行,每台机器上运行着 相同数量的进程 。编写解决方案,计算每台机器各自完成一个进程任务的平均耗时。
完成一个进程任务的时间指进程的'end' 时间戳
减去 'start' 时间戳
。平均耗时通过计算每台机器上所有进程任务的总耗费时间除以机器上的总进程数量获得。
结果表必须包含machine_id(机器ID)
和对应的 average time(平均耗时) 别名 processing_time
,且四舍五入保留3位小数。
以 任意顺序 返回表。(来源:Leecode)
🎯 应用第一性原理来思考这个 SQL 题目
✅ 第一步:还原每个事件的本质单位
我们知道,每个 (machine_id, process_id)
都有两个活动:
-
一次
'start'
(开始时间) -
一次
'end'
(结束时间)
而我们要计算的,是这对事件之间的时间差:
end.timestamp - start.timestamp
这意味着:我们要把这两个记录放在同一行中,也就是事件对还原。
✅ 第二步:如果一个表只有事件,如何构造事件对?
可以把表自己 JOIN 一下,试试看拼出一对记录!
这就是经典的 自连接(Self Join)策略 —— 它不是死记硬背的 SQL 技巧,而是从数据结构出发的推理:
FROM Activity t1, Activity t2
✅ 第三步:加过滤条件,只保留“同一机器、同一进程”的行组合
where t1.machine_id = t2.machine_id and t1.process_id = t2.process_id
这一层筛掉了不同机器、不同进程的组合,只保留你真正要比较的配对 —— 同一个进程在同一台机器上(也就是必须是 start
+ end
的那一对)。
✅ 第四步:再过滤,只保留从 start
到 end
的方向
and t1.activity_type = 'start'
and t2.activity_type = 'end'
为什么这一步关键?因为之前虽然我们筛出了同一个进程的两个事件,但没说明谁是开始谁是结束。
你必须明确:
-
t1
是start
-
t2
是end
这样你才能计算:
t2.timestamp - t1.timestamp
否则你可能会把 end - end
、start - start
、甚至 start - end
都拿来算,结果错乱。
最终筛选:
WHERE t1.machine_id = t2.machine_id AND t1.process_id = t2.process_id AND t1.activity_type = 'start' AND t2.activity_type = 'end'
✅ 第五步:思考目标层级 —— 我们要“按机器”聚合
第一性思维问:“我们最后是要按什么单位输出?”
答案是每台机器的平均耗时 → 所以我们用:
GROUP BY t1.machine_id
并用 AVG(t2.timestamp - t1.timestamp)
得到结果。
✅ 最后一步:结构简化为计算表达式
SELECT t1.machine_id, ROUND(AVG(t2.timestamp - t1.timestamp), 3) AS processing_time
FROM Activity t1, Activity t2
WHERE t1.machine_id = t2.machine_id AND t1.process_id = t2.process_id AND t1.activity_type = 'start' AND t2.activity_type = 'end'
GROUP BY t1.machine_id;
把问题从“做计算”→“拼接事件”→“组合计算”→“聚合分组”完全拆解,这就是第一性分析法!
🎓 小结:SQL 中的第一性原理套路
问题类型 | 第一性问题 | 拆解方法 |
---|---|---|
一张表中记录事件多个步骤 | 我怎么才能还原一对记录? | 用 Self Join,按条件连接拼成一行 |
一张记录表要“还原状态”再分析 | 我能不能让记录拆成字段? | 用 CASE WHEN 聚合 或 Self Join 建模 |
不知道从哪一步开始写复杂运算 | 能不能先 JOIN 看看? | 用原始 JOIN 探索,再逐步加 WHERE + GROUP |
这是第一性学习的关键训练方法。别急着背模板,从“结构 → 关系 → 目的”一步步推出答案,才是真正掌握 SQL 的方式。
相关文章:
思路解析:第一性原理解 SQL:连接(JOIN)
目录 题目描述 🎯 应用第一性原理来思考这个 SQL 题目 ✅ 第一步:还原每个事件的本质单位 ✅ 第二步:如果一个表只有事件,如何构造事件对? ✅ 第三步:加过滤条件,只保留“同一机器、同一进…...
Java面向对象三大特性深度解析
Java面向对象三大特性封装继承多态深度解析 前言一、封装:数据隐藏与访问控制的艺术1.1 封装的本质与作用1.2 封装的实现方式1.2.1 属性私有化与方法公开化1.2.2 封装的访问修饰符 二、继承:代码复用与类型扩展的核心机制2.1 继承的定义与语法2.2 继承的…...

LabVIEW在电子电工教学中的应用
在电子电工教学领域,传统教学模式面临诸多挑战,如实验设备数量有限、实验过程存在安全隐患、教学内容更新滞后等。LabVIEW 作为一款功能强大的图形化编程软件,为解决这些问题提供了创新思路,在电子电工教学的多个关键环节发挥着重…...

Vue3 怎么在ElMessage消息提示组件中添加自定义icon图标
1、定义icon组件代码: <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName" :fill"color"/></svg> </template><script> export default defineComponen…...

生活破破烂烂,AI 缝缝补补(附提示词)
写在前面:【Fire 计算器】已上线,快算算财富自由要多少 现实不总温柔,愿你始终自渡。 请永远拯救自己于水火之中。 毛绒风格提示词(供参考): 1. 逼真毛绒风 Transform this image into a hyperrealist…...

张 。。 通过Token实现Loss调优prompt
词编码模型和 API LLM不匹配,采用本地模型 理性中性案例(针对中性调整比较合理) 代码解释:Qwen2模型的文本编码与生成过程 这段代码展示了如何使用Qwen2模型进行文本的编码和解码操作。 模型加载与初始化 from transformers import AutoModelForCausalLM, AutoTokenizer...
Ubuntu 22.04.5 LTS上部署Docker及相关优化
以下是在Ubuntu 22.04.5 LTS上部署Docker及相关优化的步骤: 安装Docker 更新系统:在安装Docker之前,先确保系统是最新的,执行以下命令:sudo apt update sudo apt upgrade -y安装依赖包:安装一些必要的依赖…...

JVM学习专题(一)类加载器与双亲委派
目录 1、JVM加载运行全过程梳理 2、JVM Hotspot底层 3、war包、jar包如何加载 4、类加载器 我们来查看一下getLauncher: 1.我们先查看getExtClassLoader() 2、再来看看getAppClassLoader(extcl) 5、双亲委派机制 1.职责明确,路径隔离ÿ…...

PyTorch API 9 - masked, nested, 稀疏, 存储
文章目录 torch.randomtorch.masked简介动机什么是 MaskedTensor? 支持的运算符一元运算符二元运算符归约操作查看与选择函数 torch.nested简介构造方法数据布局与形状支持的操作查看嵌套张量的组成元素填充张量的相互转换形状操作注意力机制 与 torch.compile 的配…...

进程相关面试题20道
一、基础概念与原理 1.进程的定义及其与程序的本质区别是什么? 答案:进程是操作系统分配资源的基本单位,是程序在数据集合上的一次动态执行过程。核心区别: 动态性:程序是静态文件,进程是动态执行实例…...
微信小程序学习之轮播图swiper
轮播图是小程序的重要组件,我们还是好好学滴。 1、上代码,直接布局一个轮播图组件(index.wxml): <swiper class"swiper" indicator-active-color"#fa2c19" indicator-color"#fff" duration"{{durati…...
【万字逐行详解】深入解析ONNX Runtime图像分类程序main函数
本文将全面、详尽地解析一个使用ONNX Runtime进行图像分类的C++程序,不省略任何一行代码,逐行解释其语法和实现原理。这个程序展示了现代C++在计算机视觉领域的完整应用流程,从模型加载到结果可视化,涵盖了异常处理、性能分析等工程实践。 程序完整解析 1. 主函数框架 i…...

Linux复习笔记(五) 网络服务配置(dhcp)
二、网络服务配置 2.5 dhcp服务配置(不涉及实际操作) 要求:知道原理和常见的参数配置就行 2.5.1 概述DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) DHCP(Dynamic Host Conf…...
智慧工厂管理平台推荐?智慧工厂解决方案提供商有哪些?智慧工厂管理系统哪家好?
随着工业4.0和“双碳”目标的推进,智慧工厂管理平台成为制造企业数字化转型的核心工具。本文基于技术实力、应用场景、安全可靠三大维度,结合最新行业实践与用户需求,精选出十大智慧工厂解决方案提供商,助您快速匹配行业需求&…...
鸿蒙OSUniApp 实现的语音输入与语音识别功能#三方框架 #Uniapp
UniApp 实现的语音输入与语音识别功能 最近在开发跨平台应用时,客户要求添加语音输入功能以提升用户体验。经过一番调研和实践,我成功在UniApp项目中实现了语音输入与识别功能,现将过程和方法分享出来,希望对有类似需求的开发者有…...

windows版redis的使用
redis下载 Releases microsoftarchive/redishttps://github.com/microsoftarchive/redis/releases redis的启动和停止 进入路径的cmd 启动:redis-server.exe redis.windows.conf 停止:ctrlc 连接redis 指定要连接的IP和端口号 -h IP地址 -p 端口…...

Java版OA管理系统源码 手机版OA系统源码
Java版OA管理系统源码 手机版OA系统源码 一:OA系统的主要优势 1. 提升效率 减少纸质流程和重复性工作,自动化处理常规事务,缩短响应时间。 2. 降低成本 节省纸张、打印、通讯及人力成本,优化资源分配。 3. 规范管理 固化企…...

NineData 社区版 V4.1.0 正式发布,新增 4 条迁移链路,本地化数据管理能力再升级
NineData 社区版 V4.1.0 正式更新发布。本次通过新增 4 条迁移链路扩展、国产数据库深度适配、敏感数据保护增强等升级,进一步巩固了其作为高效、安全、易用的数据管理工具的定位。无论是开发测试、数据迁移,还是多环境的数据管理,NineData…...

进阶2_1:QT5多线程与定时器共生死
1、在widget.ui中使用 LCD Number控件 注意:若 LCD 控件不是多线程,LCD控件则会瞬间自增到最大的数值,如上图,说明两者都是多线程处理 2、实现方式 1、创建 LCD 控件并修改为 LCD1 2、创建任务类 mytask. h,对任务类…...

在虚拟机Ubuntu18.04中安装NS2教程及应用
NS2简介 一、主要组成部分: 1.NS2:模拟器本身,负责执行TCL脚本进行模拟,并生成trace文件输出结果。 2.NAM:网络动画模拟器,用于将模拟结果可视化。 二、使用的语言: 1.C:NS2中最重要…...

VBA —— 第6章子程序与函数
子程序:实现特定功能的程序代码块 子程序语法: [修饰符] Sub 子程序名称([参数1,参数2,参数3]) 代码块 End Sub 子程序如何调用: 1 . 子程序名 [参数1,参数2,...] 2. Call 子程序名 [(参…...
MySQL知识点总结(持续更新)
聚合函数通常用于对数据进行统计和聚合操作。以下是一些常见数据库系统(如 MySQL、PostgreSQL、Oracle、SQL Server 等)中常用的聚合函数: 常见的数据库聚合函数: COUNT():计算指定列中非空值的数量 SELECT COUNT(*) …...

全新开发-iVX图形化编程VS完整IDE
本文针对传统软件开发的效率与可控性矛盾,系统阐释 iVX"图形化编程 全栈 IDE" 的复合架构如何突破行业瓶颈。通过 "可视化建模 - 标准代码生成 - 独立运行" 的技术闭环,iVX 实现开发效率提升 60% 与源码完全可控的双重目标。研究揭…...
【android bluetooth 协议分析 12】【A2DP详解 1】【车机侧蓝牙音乐免切源介绍】
“车机蓝牙音乐免切源” 是近年来车载系统(IVI,In-Vehicle Infotainment)中常见的一个用户体验优化功能。它主要是为了简化蓝牙音乐播放流程、减少用户操作,提升使用便捷性。 一、什么是“切源”? 在车机系统中&#…...

【Linux系列】跨平台安装与配置 Vim 文本编辑器
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
蓝桥杯题库经典题型
1、数列排序(数组 排序) 问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<n<200 输入格式 第一行为一个整数n。 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。 输出格式 输出…...
Spring Boot整合MyBatis全攻略:原理剖析与最佳实践
MyBatis作为Java生态中最流行的ORM框架之一,与Spring Boot的结合极大地简化了数据库访问层的开发。本文将深入剖析Spring Boot整合MyBatis的核心机制,详细介绍各种使用方式,并分享实际开发中的高级技巧和最佳实践。 一、Spring Boot与MyBati…...

十天学会嵌入式技术之51单片机—day-10
第 20 章 18B20 温度检测 20.1 18B20 概述 20.1.1 简介 18B20 是一种常用的数字温度传感器,广泛应用于环境监测、工业控制、家居自动化 和设备温度监控等领域。 20.1.2 引脚功能 18B20 引脚功能如下图所示,需要特别强调的是,18B20 采用 1-…...

【C++】17. 多态
上一章节中我们讲了C三大特性的继承,这一章节我们接着来讲另一个特性——多态 1. 多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点讲运行时多态…...
Excel的详细使用指南
### **一、Excel基础操作** #### **1. 界面与基本概念** - **工作簿(Workbook)**:一个Excel文件(扩展名.xlsx)。 - **工作表(Worksheet)**:工作簿中的单个表格(默认名…...