SQL进阶技巧:火车票相邻座位预定一起可能情况查询算法 ?

目录

0  场景描述

1 数据准备

2 问题分析

2.1 分析函数法

2.2 自关联求解

3 小结

如果觉得本文对你有帮助,那么不妨也可以选择去看看我的数字化建设通关指南博客专栏 ,或许对你更有用。专栏原价99,现在活动价29.9,按照阶梯式增长,直到恢复原价。


0  场景描述

假设是 3 个朋友一起坐高铁出去玩,希望能预定到相邻的座位。现在这趟车某个车厢里每排的座位的编号是 A、B、C、D、F,其中,A 和 F 是靠窗位置,C 和 D 之间是过道。即使隔着过道,C 和 D 仍是可以看作是相邻的座位。求三个人能预定到一起的座位情况?

seats 是座位预定表,表结构如下:

CREATE TABLE `seats` (`id` int unsigned NOT NULL AUTO_INCREMENT,`row_no` int DEFAULT NULL COMMENT '第几排',`seat` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '座位',`status` int NOT NULL COMMENT '预定状态 0-未预定 1-已预定',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8

其中,id 是主键,从 1 起连续递增。

seats 表的数据:

 id        row_no  seat          status  1       1       A              12       1       B              13       1       C              04       1       D              05       1       F              06       2       A              17       2       B              08       2       C              09       2       D              010       2       F              011       3       A              012       3       B              113       3       C              114       3       D              015       3       F              0

1 数据准备

create table seat as (select stack(15,1, 1, 'A', 1,2, 1, 'B', 1,3, 1, 'C', 0,4, 1, 'D', 0,5, 1, 'F', 0,6, 2, 'A', 1,7, 2, 'B', 0,8, 2, 'C', 0,9, 2, 'D', 0,10, 2, 'F', 0,11, 3, 'A', 0,12, 3, 'B', 1,13, 3, 'C', 1,14, 3, 'D', 0,15, 3, 'F', 0) as (id, row_num, seat, status))
;

 

2 问题分析

2.1 分析函数法

 第一步:获取相邻3个座位的各种组合情况

(1)过滤掉已预定的座位

(2)利用自增id进行相邻判断

(3)找出连续相邻的三个座位并组合一起

      注意此处必须座位编号是连续的,为了找出连续的3个座位我们使用了窗口子句,此时窗口的范围应该使用range子句而不是rows,利用range进行逻辑上的计算来判断是否连续。

具体SQL如下:

select id, row_num, seat, status, collect_list(seat) over (partition by row_num order by id range between current row and 2 following) seat_strfrom seatwhere status != 1

 

第二步:找出数组长度为3的组合,即为最终结果

最终SQL如下:

select row_num, concat_ws(',', seat_str) seat_str
from (select id, row_num, seat, status, collect_list(seat)over (partition by row_num order by id range between current row and 2 following) seat_strfrom seatwhere status != 1) t
where size(seat_str) = 3
;

2.2 自关联求解

步骤1:获取同一排中所有相邻的三个座位

SELECT a.row_num row_num, a.seat, b.seat
FROM seat a,seat b
where a.row_num = b.row_numand a.id + 2 = b.idand a.status = 0and b.status = 0

步骤2: 将相邻的座位组合

select row_num,concat_ws('~', a_seat, b_seat) seat_str
from (SELECT a.row_num row_num, a.seat    a_seat, b.seat    b_seatFROM seat a,seat bwhere a.row_num = b.row_numand a.id + 2 = b.idand a.status = 0and b.status = 0) t

 

3 小结

本文给出了一种火车票相邻座位预定一起可能情况查询算法 ,采用了两种思路进行求解,一种利用分析函数,采用窗口子句range进行逻辑计算相邻情况,一种利用自关联的形式,控制关联条件进行求解。

如果觉得本文对你有帮助,那么不妨也可以选择去看看我的数字化建设通关指南博客专栏 ,或许对你更有用。专栏原价99,现在活动价29.9,按照阶梯式增长,直到恢复原价。


部分内容如下:
(1)SQL进阶实战技巧
可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得
       1)新人入职新公司后应如何快速了解业务?

       2)以业务视角看宽表化建设?

       3)  维度建模 or 关系型建模?

       4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

       5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系                           该由谁来搭建?

       6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

       7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

       8) 数据架构的选择,mpp or hadoop?

       9)数仓团队应如何体现自己的业务价值,讲好数据故事?

       10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关                          系?

       11)数据部门如何与业务部门沟通,并规划指引业务需求?

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下:

数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是上拉,下拉?

上拉就是将引脚通过一个电阻连接到电源,作用:1.使IO口的不确定电平稳定在高点平,2、为了增加IO口拉电流的能力。 下拉就是将引脚通过一个电阻与GND相连,作用:1.从器件输出电流 2.当IO口为输入状态时,引脚的…

GitHub Star 数量前 13 的自托管项目清单

一个多月前,我们撰写并发布了这篇文章《终极自托管解决方案指南》。在那篇文章里我们深入探讨了云端服务与自托管方案的对比、自托管的潜在挑战、如何选择适合自托管解决方案,并深入介绍了五款涵盖不同场景的优秀自托管产品。 关于自托管的优势&#xf…

快速了解高并发解决方案

对《高并发的哲学原理》的个人总结,原书地址如下 https://pphc.lvwenhan.com/ 本书的核心思想就是拆分,服务细化拆分多资源并行。 通用设计方法 例子:每秒100万次http请求 通过架构解决性能问题,在面对并发需求时&#xff…

Tuxera NTFS for Mac 2023绿色版

​ 在数字化时代,数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作,然而,由于MacOS系统默认不支持NTFS的写操作,这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…

idea激活页面怎么打开

打开Help------选择Register 然后就可以选择激活方式了

Java 入门指南:JVM(Java虚拟机)——类的生命周期与加载过程

文章目录 类的生命周期类加载过程1)载入(Loading)2)验证(Verification)文件格式验证符号引用验证 3)准备(Preparation)4)解析(Resolution&#xf…

【渗透测试】——DVWA靶场搭建

📖 前言:DVWA(Damn Vulnerable Web Application)是一个用于安全漏洞测试的 PHP/MySQL 网络应用,旨在为安全专业人士提供一个合法的环境,以测试他们的技能和工具,同时帮助 Web 开发者更好地理解 …

探索自动化的魔法:Python中的pyautogui库

文章目录 探索自动化的魔法:Python中的 pyautogui 库背景:为什么选择pyautogui?pyautogui是什么?如何安装pyautogui?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索自动化的魔法:Python中的 …

Cyber Weekly #24

赛博新闻 1、OpenAI发布最强模型o1 本周四(9月12日),OpenAI宣布推出OpenAIo1系列模型,标志着AI推理能力的新高度。o1系列包括性能强大的o1以及经济高效的o1-mini,适用于不同复杂度的推理任务。新模型在科学、编码、数…

用nginx-rtmp-win32-master及ffmpeg模拟rtmp视频流

效果 使用nginx-rtmp-win32-master搭建RTMP服务 双击exe就可以了。切记整个目录不能有中文 README.md ,启用后本地的RTM路径: rtmp://192.168.1.186/live/xxx ffmpeg将地本地视频推RMTP F:\rtsp\ffmpeg-7.0.2-essentials_build\bin>ffmpeg -re -i F:\rtsp\123.mp4 -c c…

红黑树前语

目录 概念 性质 红黑树与AVL树的比较 过两天更新红黑树的模拟实现,中秋快乐各位 概念 1. 概念: 是一种搜索二叉树, 但在每个结点上增加一个存储位表示节点的颜色,可以是Red 或 Black。通过对任何一条从根到叶子的路径上各个节点着色方式的…

C++_20_多态

多继承会造成 菱形继承** 使用虚继承来解决 不是给爷爷类加 也不是给子类加 是给父类加 虚基指针和虚基表 多态 概念: 概念: 一个事物的多种形态,简称多态 如: 对象的多态 ​ 张三 ​ 在对象面前 怂 ​ 在朋友面前 谄媚 ​ 在父…

rabbitmq容器化部署

需求 容器化部署rabbitmq服务 部署服务 找到如下官网信息版本 官网版本发布信息 这里看到最新版本是3.13版本,这里在3.13中找一个版本下载容器镜像即可。 找到dockrhub.com中 找到3.13.2版本镜像。 容器服务安装此处省略 现在下载容器镜像需要配置容器代理 ~#…

免费像素画绘制软件 | Pixelorama v1.0.3

Pixelorama 是一款开源像素艺术多工具软件,旨在为用户提供一个强大且易于使用的平台来创作各种像素艺术作品,包括精灵、瓷砖和动画。这款软件以其丰富的工具箱、动画支持、像素完美模式、剪裁遮罩、预制及可导入的调色板等特色功能,满足了像素…

Win电脑使用Ollama与Open Web UI搭建本地大语言模型运行工具

文章目录 前言1. 运行Ollama2. 安装Open WebUI2.1 在Windows系统安装Docker2.2 使用Docker部署Open WebUI 3. 安装内网穿透工具4. 创建固定公网地址 前言 本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具,并安装Open WebUI结合cpolar内网穿透软…

8. Transforms的使用(三)-- Resize

Transforms的使用(三) 1. 为什么要使用Resize 在模型的训练过程中往往需要图片数据的维度相同,才能适应深度学习模型中的相关神经网络结构,这时候就需要使用Resize保证所有的图片保持相同的尺寸2. 使用Resize调整图片的尺寸 在pytorch2.3的版本上,Resize()支持对Tensor类…

Vue2学习笔记(01计算属性和监视属性)

1、事件修饰符 2、计算属性-computed 要显示的数据不存在,要通过计算得来。在computed对象中定义计算属性。在页面中使用{{方法名}}来显示计算的结果。 3、监视属性-watch 通过vm对象的$watch()或watch配置来监视指定的属性当属性变化时,回调函数自动调用,在函数内…

2024.9.14 Python与图像处理新国大EE5731课程大作业,马尔可夫随机场和二值图割,校正立体图像的深度

1.马尔科夫随机场和二值图割 马尔可夫随机场(MRF, Markov Random Field): MRF 是一种用来描述图像像素之间空间关系的概率模型。它假设图像中的像素不仅取决于自身的值,还与周围像素有关。这种模型经常用于图像分割、去噪等任务。…

【C++】关键字、命名空间、输入和输出、缺省参数的深入了解

目录 一、C关键字二、命名空间2.1 为什么存在命名空间?2.2 命名空间定义2.3 命名空间使用 三、C输入&输出四、缺省函数4.1 缺省函数分类 总结 一、C关键字 C一共有63个关键字 其中红色圈出来的32个关键字同时也是C语言的 二、命名空间 2.1 为什么存在命名空间…

MySQL 按照条件(分组)只取一个形成列表 group max

方法一、通过Max形成where条件 SELECTt1.* FROMbiz_customer_hold AS t1 WHEREt1.ch_create_time ( SELECT MAX( ch_create_time ) FROM biz_customer_hold AS t2 WHERE t2.ch_cust_no t1.ch_cust_no ) ORDER BYt1.ch_create_time DESC,t1.ch_hold_time DESC 方法二、通…