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

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              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.kler.cn/news/306436.html

相关文章:

  • 喜报 | 知从科技荣获 “AutoSec 安全之星 - 优秀汽车软件供应链安全方案奖”
  • Qt:Q_GLOBAL_STATIC实现单例(附带单例使用和内存管理)
  • 有了数据中台,是否需要升级到数据飞轮?怎么做才能升级到数据飞轮?
  • 并行编程实战——TBB中的Task
  • C++的内存分布
  • FastAPI与环境变量:实现无缝切换与高效运维
  • Python操作MySQL
  • 常见生成模型有哪些?生成模型前后存在依赖关系,怎么处理更合适
  • 二分算法——优选算法
  • 排队免单模式小程序开发
  • Harmony OS DevEco Studio低代码开发流程 - HarmonyOS开发自学5
  • 【Linux进程】Linux Shell编程实战:构建简易脚本示例与技巧详解
  • Unity3D 小案例 像素贪吃蛇 02 蛇的觅食
  • Oracle EBS中AR模块的财务流程概览
  • 安全API
  • 综合案例-数据可视化-柱状图
  • python 读取excel数据存储到mysql
  • JVM 运行时数据区域
  • Amazon EC2:引领企业迈向云计算的未来
  • Lua 拷贝
  • 本地调试spark,访问kerberos鉴权的hdfs、hive
  • SOEX解锁Web3社交软件的无限可能
  • strncpy函数的使用和模拟实现
  • 远程Linux网络连接( Linux 网络操作系统 04)
  • Flutter启动无法运行热重载
  • 动态库相关知识解析
  • 教育培训小程序开发,简单实用的入门指南
  • GO 匿名函数
  • 【python版】示波器输出的csv文件(时间与电压数据)如何转换为频率与幅值【方法③】
  • 【解决方案】实验室管理系统(lims)整体解决方案设计书(word原件)