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

mysql -- WITH RECURSIVE 语法

引言

在 SQL 中,WITH RECURSIVE 是一个用于创建递归查询的语句。它允许你定义一个 Common Table Expression (CTE),该 CTE 可以引用自身的输出。递归 CTE 非常适合于查询具有层次结构或树状结构的数据,例如组织结构、文件系统或任何其他具有自引用关系的数据。

一、基本语法

WITH RECURSIVE cte_name (column1, column2, ...) AS (-- 非递归的初始部分,定义了 CTE 的起点SELECT ...FROM ...UNION ALL-- 递归部分,可以引用 CTE 的别名SELECT ...FROM cte_nameWHERE ...
)
-- 最后的 SELECT 或其他 DML 语句,使用递归 CTE
SELECT * FROM cte_name;

二、示例

假设我们有一个表示组织结构的表 employees,其中包含 id, manager_id 和 name 字段。manager_id 是员工的上级经理的 id,如果 manager_id 是 NULL,则表示该员工是 CEO 或顶层经理。

我们想要查询整个组织结构中的所有员工及其上级经理。

WITH RECURSIVE employee_hierarchy (id, name, manager_id, path) AS (-- 非递归的初始部分:查找顶层经理(没有经理的员工)SELECTid,name,manager_id,CONCAT(name, '/') AS path -- 使用 CONCAT 创建初始路径FROM employeesWHERE manager_id IS NULLUNION ALL-- 递归部分:查找所有下属SELECTe.id,e.name,e.manager_id,CONCAT(e.name, '/', eh.path) AS path -- 将当前员工添加到路径中FROM employees eINNER JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;

在这个例子中:

  • WITH RECURSIVE 开始定义一个递归 CTE employee_hierarchy。
  • CTE 中的 column1, column2, … 是你想要在结果中选择的列。
  • 初始查询部分(在 UNION ALL 之前)定义了递归的起点,通常是顶级节点或者查询的基本情况。
  • 递归查询部分(在 UNION ALL 之后)使用 CTE 的别名来引用自身的输出,以便能够递归地查询下属或子节点。
  • UNION ALL 用于合并初始查询和递归查询的结果,它允许重复的行,这是递归查询的关键部分。
  • 最后的 SELECT * FROM employee_hierarchy; 是最终的查询,它将返回 CTE 的全部结果。

递归 CTE 是 SQL 中处理分层数据的强大工具,但它们也可能很复杂,需要仔细设计以避免无限递归或不正确的结果。

三、实战案例–查询 最近12个月的诊断量数据

1. 按要求实现以下需求:

1.建表语句如下:
CREATE TABLE rkk_dzblzdl (
id int NOT NULL AUTO_INCREMENT COMMENT ‘id’,
month varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘月份(1-12月)’,
zdcs int DEFAULT NULL COMMENT ‘诊断次数’,
xzqh varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘行政区划’,
PRIMARY KEY (id)
)COMMENT=‘电子病历诊断量’;

2.要求查询 最近12个月的诊断量数据,按行政区划/月份 合并统计;
3.结果返回 诊断次数,月份,按月份排序;
4.返回 数据更新时间,取当前最大的月份

2.实现结果

WITH RECURSIVE RecentMonths AS (  SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS month  UNION ALL  SELECT DATE_FORMAT(DATE_SUB(STR_TO_DATE(CONCAT(month, '-01'), '%Y-%m-%d'), INTERVAL 1 MONTH), '%Y-%m')  FROM RecentMonths  WHERE STR_TO_DATE(CONCAT(month, '-01'), '%Y-%m-%d') > DATE_SUB(CURDATE(), INTERVAL 12 MONTH)  
)  SELECT   COALESCE(r.xzqh, rm.month) AS xzqh,   rm.month AS month,   SUM(r.zdcs) AS zdcs_count,  (SELECT MAX(month) FROM rkk_dzblzdl) AS last_updated_month_in_table  
FROM   RecentMonths rm  
LEFT JOIN   rkk_dzblzdl r ON rm.month = r.month  
GROUP BY   rm.month, r.xzqh  
ORDER BY   STR_TO_DATE(CONCAT(rm.month, '-01'), '%Y-%m-%d') DESC, r.xzqh;

这个查询使用了递归的公用表表达式(CTE)RecentMonths 来生成最近12个月的月份列表。然后,它将这些月份与 rkk_dzblzdl 表进行左连接,以便即使在某个月份没有诊断数据时也能在结果集中显示该月份。

COALESCE(r.xzqh, rm.month) 确保即使在某个月份没有特定行政区划的数据时,也能显示月份。

MAX(rm.month) OVER () 是一个窗口函数,用于在整个结果集上计算最大的月份,并作为 last_updated_month 返回。由于它是窗口函数,所以它的值对于结果集中的每一行都是相同的。

最后,结果集按照月份降序和行政区划升序进行排序。

相关文章:

mysql -- WITH RECURSIVE 语法

引言 在 SQL 中,WITH RECURSIVE 是一个用于创建递归查询的语句。它允许你定义一个 Common Table Expression (CTE),该 CTE 可以引用自身的输出。递归 CTE 非常适合于查询具有层次结构或树状结构的数据,例如组织结构、文件系统或任何其他具有…...

洗地机什么品牌好?洗地机怎么选?618洗地机选购指南

随着科技的飞速发展,洗地机以其高效的清洁能力、稳定的性能和用户友好的设计而闻名,不仅可以高效吸尘、拖地,还不用手动洗滚布,已经逐渐成为现代家庭不可或缺的清洁助手。然而,在众多品牌和型号中,如何选择…...

nginx负载均衡配置

1.nginx负载均衡配置 upstream lbs {server 192.168.1.12:8080;server 192.168.1.12:8081; }server {listen 80;server_name localhost a.com;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}locatio…...

HarmonyOS NEXT星河版之美团外卖点餐功能实战(中)

接上 一、UI布局 1.1 购物车Item Preview Component export struct MTCartItemView {build() {Row({ space: 6 }) {Image(https://bkimg.cdn.bcebos.com/pic/4d086e061d950a7bc94a331704d162d9f3d3c9e2).width(42).aspectRatio(1).borderRadius(5)Column({ space: 3 }) {Text…...

CTF-Web Exploitation(持续更新)

CTF-Web Exploitation 1. GET aHEAD Find the flag being held on this server to get ahead of the competition Hints Check out tools like Burpsuite to modify your requests and look at the responses 根据提示使用不同的请求方式得到response可能会得到结果 使用…...

图书管理系统c语言

创建一个图书管理系统是一个涉及数据结构和文件操作的项目。在C语言中,你可以使用结构体来表示图书信息,使用函数来实现系统的各项功能。以下是一个简单的图书管理系统的示例,包括基本的添加、显示、查找和删除图书的功能。 1. 定义图书结构…...

森林消防—高扬程水泵,高效、稳定、可靠!/恒峰智慧科技

森林,作为地球的“绿色肺叶”,不仅为我们提供了丰富的自然资源,更是维持生态平衡的重要一环。然而,随着全球气候的变化和人为活动的增加,森林火灾频发,给生态环境和人民生命财产安全带来了巨大威胁。在森林…...

光伏设备制造5G智能工厂数字孪生可视化平台,推进行业数字化转型

光伏设备制造5G智能工厂数字孪生可视化平台,推进行业数字化转型。光伏设备制造5G智能工厂数字孪生可视化平台是光伏行业数字化转型的重要一环。通过数字孪生平台,光伏设备制造企业可以实现对生产过程的全面监控和智能管理,提高生产效率&#…...

【论文阅读笔记】TS2Vec: Towards Universal Representation of Time Series

【论文阅读笔记】TS2Vec: Towards Universal Representation of Time Series 摘要 这段文字介绍了一个名为TS2Vec的通用框架,用于学习时间序列数据的表示,可以在任意语义层次上进行。与现有方法不同,TS2Vec通过对增强的上下文视图进行层次化…...

windows驱动开发-DMA技术(一)

DMA(Direct Memory Access)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于 CPU 的大量中断负载,否则CPU 需要从设备缓存中把每一页的数据复制到缓存中,然后把它们再次写入到新的地方,在这个过…...

实用的Chrome命令

以下是一些实用的Chrome命令及其用途: --allow-outdated-plugins:允许浏览器使用过期的插件,这在开发过程中可能会用到,以便测试兼容性。chrome://downloads:打开Chrome的下载页面,查看和管理你的下载文件…...

数据库(MySQL)基础:约束

一、概述 1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 2.目的:保证数据库中数据的正确、有效性和完整性。 3.分类 约束描述关键字非空约束限制该字段的数据不能为nullnot null唯一约束保证该字段的所有数据都是唯一…...

ControlNet作者放大招!IC-Light:控制生成图片光照效果!

ControlNet作者张吕敏近日又开源了一项新的工作:IC-Light (Impose Constant Light),在不改变图片内容的条件下,可以控制生成图片的光照效果。 作者发布了两种类型的模型:文本条件重打光模型和背景条件重打光…...

【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)

📝个人主页:哈__ 期待您的关注 目录 一、无继承关系类的初始化 1、静态变量k被初始化 2、静态变量t1初始化 3、静态变量 t2初始化 4、静态变量i初始化 5、静态变量n初始化 6、静态块初始化 7、非静态块初始化 8、非静态属性初始化 9、执行构造…...

在RK3588开发板使用FFMpeg 结合云服务器加SRS实现摄像头数据推流到云端拱其他设备查看

今天测试了一把在开发板把摄像头数据推流到云端服务器,然后给其他电脑通过val软件拉取显示摄像头画面,浅浅记录一下大概步骤 1.开发板端先下载ffmpeg apt install ffmpeg2.云服务器先安装SRS的库 云服务器我使用ubuntu系统,SRS是个什么东西&…...

elasticsearch搭建教程

主要参看这里就行,需要特别注意其中报错的解决方案:搭建elasticsearch 单机节点里,按照上述教程搭建只能开放本地访问,如果需要其他机器访问,需要在elasticsearch.yml里新增几个配置: node.name: node-1 network.host…...

c++ 归并排序

归并排序是一种遵循分而治之方法的排序算法。它的工作原理是递归地将输入数组划分为较小的子数组并对这些子数组进行排序,然后将它们合并在一起以获得排序后的数组。 简单来说,归并排序的过程就是将数组分成两半,对每一半进行排序&#xff0c…...

基于vs和C#的WPF应用之动画3

注&#xff1a;1、在内部和外部使用缓动函数 <Grid.Resources> <PowerEase x:Key"powerease" Power"3" EasingMode"EaseInOut"/> </Grid.Resources> <DoubleAnimation EasingFunction"{StaticResource powerease}&quo…...

Python import 必看技巧:打造干净利落的代码结构

大家好,学习Python你肯定绕不过一个概念import,它是连接不同模块的桥梁,是实现代码复用和模块化的关键。本文将带你深入探索Python中import的原理,并分享一些实用的导入技巧。 1. import 原理 导入机制概述 在Python中,模块(module)是一种封装Python代码的方式,它允许…...

计算机视觉(CV)(Computer Vision)

计算机视觉技术&#xff08;Computer Vision&#xff09;&#xff0c;解决的是什么&#xff1f; 图片和视频是非结构化数据&#xff0c;机器如果要理解某一图片或视频表达的内容&#xff0c;是无法直接分析的&#xff0c;这种情况&#xff0c;就需要有计算机视觉技术&#xff…...

python:画折线图

import pandas as pd import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties# 设置新宋体字体的路径 font_path D:/reportlab/simsun/simsun.ttf# 加载新宋体字体 prop FontProperties(fnamefont_path)""" # 读取 xlsx 文件 d…...

Spring Data JPA 与 MyBatisPlus的比较

前言 JPA&#xff08;Java Persistence API&#xff09;和MyBatis Plus是两种不同的持久化框架&#xff0c;它们具有不同的特点和适用场景。 JPA是Java官方的持久化规范&#xff0c;它提供了一种基于对象的编程模型&#xff0c;可以通过注解或XML配置来实现对象与数据库的映射…...

【C++】STL-list的使用

目录 1、list的使用 1.1 list的构造 1.2 list的遍历 1.3 list capacity 1.4 list element access 1.5 容量相关 list是一个带头双向循环链表 1、list的使用 1.1 list的构造 1.2 list的遍历 list只有两种遍历方式&#xff0c;因为没有operator[] 因为list的双向链表&am…...

进度条(小程序)

缓冲区的概念 缓冲区是内存中的一个临时存储区域&#xff0c;用来存放输入或输出数据。在标准 I/O 库中&#xff0c;缓冲区的使用可以提高数据处理的效率。例如&#xff0c;当向终端输出文本时&#xff0c;字符通常存储在缓冲区中&#xff0c;直到缓冲区满或者遇到特定条件时才…...

PyCharm安装教程(超详细图文教程)

一、下载和安装 1.进入PyCharm官方下载&#xff0c;官网下载地址&#xff1a; https://www.jetbrains.com/pycharm/download/ 专业版安装插件放网盘了&#xff0c;网盘下载即可&#xff1a;itcxy.xyz/229.html2.安装 1.下载后找到PyCharm安装包&#xff0c;然后双击双击.ex…...

金蝶BI应收分析报表:关于应收,这样分析

这是一张出自奥威-金蝶BI方案的BI应收分析报表&#xff0c;是一张综合运用了筛选、内存计算等智能分析功能以及数据可视化图表打造而成的BI数据可视化分析报表&#xff0c;可以让企业运用决策层快速知道应收账款有多少&#xff1f;账龄如何&#xff1f;周转情况如何&#xff1f…...

salmon使用体验

文章目录 salmon转录本定量brief模式一&#xff1a;fastq作为输入文件需要特别注意得地方 模式二&#xff1a; bam文件作为输入 salmon转录本定量 brief 第一点是&#xff0c;通常说的转录组分析其中有一项是转录本定量&#xff0c;这是一个很trick的说话&#xff0c;说成定量…...

Ubuntu 20.04 安装 Ansible

使用官方的 Ubuntu PPA 更新包列表&#xff1a; apt update安装软件属性常用命令 apt install software-properties-common添加 Ansible PPA 到系统&#xff1a; add-apt-repository --yes --update ppa:ansible/ansible再次更新包列表以包括新添加的 PPA&#xff1a; apt …...

TypeScript学习笔记:强类型JavaScript的优雅之旅

在前端开发领域&#xff0c;JavaScript以其灵活性和广泛的支持度成为无可争议的王者。然而&#xff0c;随着项目规模的增长&#xff0c;JavaScript的动态类型特性开始暴露出一些问题&#xff0c;比如代码的可维护性、类型错误难以提前发现等。为了解决这些问题&#xff0c;Micr…...

监控异地组网怎么组网?

监控异地组网是指在不同地域的网络环境下&#xff0c;实现对监控设备的远程访问和管理。在传统的网络环境下&#xff0c;由于网络限制和设备配置等问题&#xff0c;监控设备的远程访问往往受到一定的限制和困扰。为了解决这个问题&#xff0c;引入了天联组网技术&#xff0c;实…...

闵行区做网站/哔哩哔哩推广网站

一&#xff0e;Core标签库 • 核心标签库主要包括通用标签、条件标签、迭代标签和与URL相关的标签。 • 在使用Core标签库的JSP文件的开始部分&#xff0c;添加代码&#xff1a; <%taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"…...

教学平台网站建设合同/企业网站推广渠道有哪些

一、准备环境1、两台虚拟机、一台正常运行oracle数据库的&#xff0c;一台装了软件没有启动数据库的&#xff08;没有进行dbca&#xff09;2、主库备库 修改环境变量&#xff0c;修改主机名&#xff0c;将主库备库的主机名都写入hosts文件二、开始搭建1.查看主库是否开启归档模…...

wordpress 更新失败/有什么功能

最近由于了解到公司业务系统中关于财务和费用报销方面的后台运维处理的案例特别多。 总结起来有如下几类&#xff1a; 1.财务对账到了审核日期没有审核的&#xff0c;过了对账日期但是没有对账提交的。 2.费用报销申请都过期了还没有提交的&#xff0c;有的甚至长达半年&#x…...

慈溪做网站公司/线下推广渠道有哪些方式

http://www.putty.ws/Putty-wanquanshiyong putty中文站 转载于:https://www.cnblogs.com/kex1n/p/5088531.html...

怎么建网站数据库/常用的网络推广方式有哪些

设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。自己写个脚本检测这类语句&#xff0c;比如order by rand()&#xff0c; 超过一定时间用Kill query thread_id 给杀掉。那能不能不要杀掉而让他正…...

wordpress url 静态化/爱站网注册人查询

SQLiteOpenHelper类是Android提供的用于操作SQLite数据库的工具类&#xff0c;该工具类能方便地创建数据库、表&#xff0c;以及管理数据库版本。 常用方法 1、 synchronized SQLiteDatabase getReadableDatabase(); 作用&#xff1a;以读写的方式打开数据库对应的SQLiteDa…...