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

news2024/11/14 21:22:13

目录

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              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

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_str
 from seat
 where 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_str
      from seat
      where 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_num
  and a.id + 2 = b.id
  and a.status = 0
  and 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_seat
      FROM seat a,
           seat b
      where a.row_num = b.row_num
        and a.id + 2 = b.id
        and a.status = 0
        and 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.coloradmin.cn/o/2138535.html

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

相关文章

深圳前海港湾学校天桥下的免费停车点探寻

​最近开车去桂湾公园停车场的路上,看到有个天桥下有很多车停着,关键是这个地方离我搬砖的前海卓越写字楼还近,要是有时候桂湾公园停车位满了,停不进去的时候,是不是可以去这个天气下薅免费停车的羊毛?哈哈…

基于YOLO深度学习和百度AI接口的手势识别与控制项目

基于YOLO深度学习和百度AI接口的手势识别与控制项目 项目描述 本项目旨在开发一个手势识别与控制系统,该系统能够通过摄像头捕捉用户的手势,并通过YOLO深度学习模型或调用百度AI接口进行手势识别。识别到的手势可以用来控制计算机界面的操作&#xff0…

【OJ刷题】双指针问题4

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…

Google宣布所有英语语种的Gemini Live用户现可免费使用

谷歌在Pixel 9系列手机的发布会上,同步推出了Gemini Live,该服务提供了一种移动对话体验,让用户和Gemini展开自由流畅的对话。Google现在宣布,所有使用英语的Gemini Live用户,可免费使用,此前为需要Advance…

RockyLinux-软件实现RAID5

一、背景 RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种将多个物理硬盘驱动器组合成单一逻辑单元的技术,目的是提高存储性能、可靠性和/或数据冗余度。虽然早期的名字中包含“独立”(Independen…

【C++】stack 和 queue 以及 容器适配器

文章目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 三、优先级队列1.优先级队列的介绍2. priority_queue的使用的使用3.模拟实现优先级队列 四、 容器适配器1.STL标准库中stack和queue的底层结构2.deque(双端对列…

Unity3D 发布后去除Development Build显示

问题描述: Build后在视野右下角看到“Development Build”白色小字 解决方法: build时不勾选Development Build项 PS: 游戏开发unity杂项知识系列:build时Development Build的作用_unity development build-CSDN博客

结构体的内存对齐

对⻬规则: 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。 对⻬数编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。 但一些编译器下并没有默认对其数 3.结…

ElK 8 收集 Nginx 日志

1. 说明 elk 版本:8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx: nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…

探索Python轻量级数据库:TinyDB的奇妙之旅

文章目录 探索Python轻量级数据库:TinyDB的奇妙之旅背景:为何选择TinyDB?什么是TinyDB?如何安装TinyDB?简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python轻量级数据库:TinyDB的奇妙之旅 背景&…

H5 three.js 实现六年级观察物体

o(&#xffe3;▽&#xffe3;)ブ 我又带着新的demo来啦~ 预览 功能点 立方体的阴影 立方体的添加 位置记录 最大限制 三视图展示 立方体的移除 答题模式 随机出题 题库出题 源码 注释算是比较全了&#xff0c;可能部分会有点绕&#xff0c;还能够再优化一下~ <!DOCTYPE …

51单片机+proteus+(DS1302+DS18B20)

目录 1.温度传感器检测&#xff08;DS18B20&#xff09; 1.1基本概念 1.1.1 DS18B20的简介 1.1.2 DS18B20的框图 ​编辑 1.1.3 DS18B20的指令 1.1.4 总线时序协议 1.2代码 1.2.1DS18B20的初始化代码 1.2.2DS18B20的读代码 1.2.3DS18B20的写时序 ​编辑 1.2.4DS18B20…

[C语言]第九节 函数一基础知识到高级技巧的全景探索

目录 9.1 函数的概念 9.2 库函数 9.2.1 标准库与库函数 示例&#xff1a;常见库函数 9.2.2 标准库与头文件的关系 参考资料和学习工具 如何使用库函数 ​编辑 9.3 ⾃定义函数 9.3.1 函数的语法形式 9.3.2函数的举例 9.4 实参与形参 9.4.1 什么是实参&#xff1f; 9…

嵌入式单片机中数码管基本实现方法

1. 点亮数码管 本节课利用已经学习的LED知识去控制一个8位数码管。 本节的原理比较简单。不需要多少时间讲。 更多时间是跟大家一起编码调试,从中学习一些编码思路和学习方法。 1.1. 什么是数码管 数码管是什么?下图就是一个数码管 从硬件上个看,其实就是8个LED组合…

Python实用的27个实例,涵盖从基础到进阶的所有领域!

Python 是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和丰富的库支持而受到开发者们的喜爱。以下列出了 27 个实用的 Python 实例&#xff0c;涵盖从基础到进阶的不同领域&#xff0c;帮助你提升编程技能。 1. 打印 "Hello, World!" print("Hello,…

企业微信如何利用群聊机器人定时推送消息

背景&#xff1a;公司其他部门有在群聊中新建机器人并定时推送消息的需求&#xff0c;webhook已准备好 1、准备一台服务器或者虚拟机&#xff0c;编写脚本 [rootlocalhost opt]# vim crontab.sh curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key4d38964b-04f2-44…

【Arduino】国产arduino驱动

买的国产 arduino&#xff0c;如果 windows识别不到。或者用 Arduino自带的Driver程序仍不能驱动。又不想用驱动精灵&#xff0c;可以直接安装驱动程序 99%大概率是CH340芯片&#xff0c;驱动下载连接如下。 你可以从 WCH 官方网站 下载并安装 CH340 驱动程序 安装即可用&am…

进阶岛 renwu5: 茴香豆:企业级知识问答工具实践闯关任务

进阶岛 renwu5: 茴香豆&#xff1a;企业级知识问答工具实践闯关任务 renwu: https://kkgithub.com/InternLM/Tutorial/blob/camp3/docs/L2/Huixiangdou/task.md 在 InternStudio 中利用 Internlm2-7b 搭建标准版茴香豆知识助手&#xff0c;并使用 Gradio 界面完成 2 轮问答&a…

什么是java的spi?

Java SPI&#xff08;Service Provider Interface&#xff09;是一种提供服务发现机制的设计模式&#xff0c;允许在运行时动态地发现、加载和替换服务的实现。SPI机制的核心思想是&#xff1a;通过接口定义服务&#xff0c;并且使用外部的实现类来提供该服务的具体功能。 目录…

这些学校就业不错且好考,努努力就能上岸的江浙沪学校!

这些学校就业不错且好考&#xff0c;努努力就能上岸&#xff0c;搭配历年数据&#xff0c;供大家参考~ 目录 ① 南京信息工程大学 ② 南京工业大学 ③ 浙江工业大学 ④ 中国计量大学 ⑤ 上海电力大学 ① 南京信息工程大学 复试线招生人数 双一流高校&#xff0c;金牛湖…