首页 > 数据库 >力扣603(MySQL)-连续空余座位(简单)

力扣603(MySQL)-连续空余座位(简单)

时间:2023-04-01 09:45:53浏览次数:56  
标签:603 over free seat 力扣 rank MySQL id

题目:

几个朋友来到电影院的售票处,准备预约连续空余座位。

你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗?

 对于如上样例,你的查询语句应该返回如下结果。

注意:

seat_id 字段是一个自增的整数,free 字段是布尔类型(‘1’ 表示空余, ‘0’ 表示已被占据)。
连续空余座位的定义是大于等于 2 个连续空余的座位。

解题思路:

建表语句:

1 create table if not EXISTS cinema_603 (seat_id int(3),free tinyint(1));
2 TRUNCATE table cinema_603;
3 insert into cinema_603 values(1,1),(2,0),(3,1),(4,1),(5,1);

这题与前面的 力扣601-体育馆的人的流量 思路一致,使用等差的思想,用连续座位号 - 排行,若是连续的,差值一定相同,再统计相同差值的个数即可。

①先筛选出free非0的数据,再给筛选后的数据以id进行连续排序,然后计算id与排序号的差值;

1 select seat_id,free,seat_id - dense_rank() over(order by seat_id) as rnk
2 from cinema_603
3 where free = 1;

 ②再以第一步查询到的rnk分组,统计差值相同的个数;

1 select seat_id,count(seat_id) over (partition by rnk) as cout
2 from (
3        select seat_id,free,seat_id - dense_rank() over(order by seat_id) as rnk
4        from cinema_603
5        where free = 1
6  ) as temp1

 ③根据上一步的查询结果,筛选出cout >= 2的数据,再按seat_id升序排列输出即可。

 1 select seat_id
 2 from (
 3     select seat_id,count(seat_id) over (partition by rnk) as cout
 4     from (
 5        select seat_id,free,seat_id - dense_rank() over(order by seat_id) as rnk
 6        from cinema_603
 7        where free = 1
 8     ) as temp1
 9 ) as temp2
10 where cout >= 2
11 order by seat_id;

 注意:

我做这道题的时候突然在想一个问题:使用row_number() over()来排序是不是更好一点,但是这两题都是以id来排序的,id不会重复,故用rank() over()、 dense_rank() over()、row_number() over()任何一种都可以。

小知识:

rank() over():是按over()里面的字段进行跳跃排序,比如:1,2,2,4,...

 dense_rank() over():是按over()里面的字段进行连续排序,比如:1,2,2,3,...

 row_number() over():是按over()里面的字段进行连续排序,比如:1,2,3,4,...

标签:603,over,free,seat,力扣,rank,MySQL,id
From: https://www.cnblogs.com/liu-myu/p/17278106.html

相关文章

  • mysql分组并每组添加序号
    --模拟表select*fromtb_test;--rownum判断@pre_parent_code是否和当前的parent_code一样,true:让@i+=1false:重置@i--再定义一个变量@pre_parent_code:=''再存上一个parent_code,只要pre_parent_code不等于当前的parent_code让@i:=0else@i+=1就ok了-......
  • Oracle与Mysql 的区别(对比学习)
    Oracle与Mysql的区别(对比学习)使用范围Oracle是大型的数据库。Oracle是收费的,且价格昂贵Mysql是中小型数据库。Mysql是开源的安装部署Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能Mysql安装完后才152M端口用户Oracle默认端口1521,默认用户是s......
  • Lixnu:如何安装、启用、访问云服务器中的MySQL数据库?
    Linux系统:CentOS7MySQL版本:5.7.41安装方法:rpm安装(需要自己解决依赖问题)云服务器:阿里云MySQL客户端:Navicat  1、准备工作:软件配置本机是否有mysql软件:rpm-qa|grepmysql是否有冲突软件mariadb:rpm-qa|grepmariadb(如果有)卸载......
  • 力扣---剑指 Offer 57. 和为s的两个数字
    输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 示例1:输入:nums=[2,7,11,15],target=9输出:[2,7]或者[7,2]示例2:输入:nums=[10,26,30,31,47,60],target=40输出:[10,30]或者[30,10] 限......
  • 力扣---剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。 示例:输入:nums= [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4]也是正确的答案之一。 提示:0<=nums.length<=500000<=nums[i]<=10000来源:力扣(LeetCode)链接:ht......
  • 开心档之MySQL WHERE 子句
    MySQLWHERE子句我们知道从MySQL表中使用SQLSELECT语句来读取数据。如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句中。语法以下是SQLSELECT语句使用WHERE子句从数据表中读取数据的通用语法:SELECTfield1,field2,...fieldNFROMtable_name1,ta......
  • 开心档之MySQL 序列使用
    MySQL序列使用MySQL序列是一组整数:1,2,3,...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的序列。使用AUTO_INCREMENTMySQL中最简单使用序列的方法就是使用MySQLAUTO_INCREMEN......
  • 使用EFCore的Code First和MySql数据库迁移(转载 )
    下辈子还当程序员 博客园首页新随笔联系订阅管理随笔-4  文章-0  评论-9  阅读- 44432使用EFCore的CodeFirst和MySql数据库迁移 1.感慨一下    随着.netcore的持续更新和升级,至少对于从事.net开发的人员和即将踏入这个领域......
  • mysql——null值和空值
    参考:https://blog.csdn.net/xp178171640/article/details/103065271?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-103065271-blog-107128984.235%5Ev27%5Epc_relevant_3mothn_strategy_and_data_recovery......
  • mysql全文索引
    建立索引语句1.需要字段字符集一致utf8mb4根据自己字段定义ALTERTABLEuserADDFULLTEXT(name,email,phone,external_id)WITHPARSERngramCHARSETutf8mb4;索引占用空间user表大约80M,创建的全文索引占用空间约100M(不含表大小)使用全文索引两种查法:select*from......