0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你知道如何去求解连续区间吗?

数据分析与开发 来源:大数据技术团队 作者:Lotus 2021-06-21 17:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

求解连续区间是数据分析、数据仓库笔试面试中常考的SQL题目,今天为各位小伙伴分享笔试面试题,期待各位拿到心仪的offer或有所收获!

1、连续出现的数字

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

+----+-----+| Id | Num |+----+-----+| 1 | 1 || 2 | 1 || 3 | 1 || 4 | 2 || 5 | 1 || 6 | 2 || 7 | 2 |+----+-----+例如,给定上面的Logs表,1是唯一连续出现至少三次的数字。

+-----------------+| ConsecutiveNums |+-----------------+| 1 |+-----------------+

解法一:自连接三次,筛选l1,l2,l3的id连续且Num相等的行

注:如果数字连续出现超过三次,Num就会出现重复值,所以需要使用distinct去重

该方法实现简单,但是时间复杂度较大,且如果改成连续出现4,5..10次,代码就会非常冗余,不具备可拓展性。

select distinct l1.Num as ConsecutiveNumsfrom Logs l1,Logs l2,Logs l3where l2.Id = l1.Id + 1and l3.Id = l2.Id + 1and l1.Num = l2.Numand l2.Num = l3.Num

解法二:使用自定义变量进行条件判断

速度比解法一快,且适用于任一连续次数

select distinct Num ConsecutiveNumsfrom( select Num, case when @prev = Num then @count := @count+1 --如果与之前相等则+1 else (@prev := Num) and (@count := 1) --如果不相等 重新赋值,count变1 end CNT from Logs,(select @prev := 0, @count := 0) t --变量初始化) t where t.CNT>=3

解法三:窗口函数

select distinct Num as ConsecutiveNumsfrom( select Num,Id, lag(Id,2)over(partition by Num order by Id) as prev from Logs)twhere t.Id = t.prev + 2

2、找到连续区间的开始和结束数字

表:Logs

+---------------+---------+| Column Name | Type |+---------------+---------+| log_id | int |+---------------+---------+ id 是上表的主键。上表的每一行包含日志表中的一个 ID。后来一些 ID 从 Logs 表中删除。编写一个 SQL 查询得到 Logs 表中的 连续区间的开始数字和结束数字。 将查询表按照 start_id 排序。查询结果格式如下面的例子: Logs 表:

+------------+| log_id |+------------+| 1 || 2 || 3 || 7 || 8 || 10 |+------------+结果表:

+------------+--------------+| start_id | end_id |+------------+--------------+| 1 | 3 || 7 | 8 || 10 | 10 |+------------+--------------+结果表应包含 Logs 表中的所有区间。 从 1 到 3 在表中。 从 4 到 6 不在表中。 从 7 到 8 在表中。 9 不在表中。 10 在表中。

解题思路:

(1)使用两个变量,一个@id用来记录logid,可以比较当下log_id与之前log_id的差值,判断是否连续。一个@num用来储存连续状态

select log_id, case when @id = log_id - 1 then @num := @num else @num := @num + 1 end num, @id := log_idfrom Logs,(select @num := 0,@id := null)t

上述输出结果如下所示

输入:{"headers":{"Logs":["log_id"]},"rows":{"Logs":[[1],[2],[3],[7],[8],[10]]}} 输出:{"headers": ["log_id", "num", "@prev_id := log_id"], "values": [[1, "1", 1], [2, "1", 2], [3, "1", 3], [7, "2", 7], [8, "2", 8], [10, "3", 10]]}

(2)得到上述结果后,用num字段分组,最小log_id为start_id,最大log_id为end_id。

select min(log_id) start_id, max(log_id) end_idfrom( select log_id, case when @id = log_id - 1 then @num := @num else @num := @num + 1 end num, @id := log_id from Logs,(select @num := 0,@id := null)t)t2group by num

3、报告系统状态的连续日期

Table: Failed

+--------------+---------+| Column Name | Type |+--------------+---------+| fail_date | date |+--------------+---------+该表主键为 fail_date。 该表包含失败任务的天数. Table: Succeeded

+--------------+---------+| Column Name | Type |+--------------+---------+| success_date | date |+--------------+---------+该表主键为 success_date。该表包含成功任务的天数. 系统每天运行一个任务。每个任务都独立于先前的任务。任务的状态可以是失败或是成功。编写一个 SQL 查询 2019-01-01 到 2019-12-31 期间任务连续同状态 period_state 的起止日期(start_date 和 end_date)。即如果任务失败了,就是失败状态的起止日期,如果任务成功了,就是成功状态的起止日期。 最后结果按照起始日期start_date排序查询结果样例如下所示: Failed table:

+-------------------+| fail_date |+-------------------+| 2018-12-28 || 2018-12-29 || 2019-01-04 || 2019-01-05 |+-------------------+Succeeded table:

+-------------------+| success_date |+-------------------+| 2018-12-30 || 2018-12-31 || 2019-01-01 || 2019-01-02 || 2019-01-03 || 2019-01-06 |+-------------------+Result table:

+--------------+--------------+--------------+| period_state | start_date | end_date |+--------------+--------------+--------------+| succeeded | 2019-01-01 | 2019-01-03 || failed | 2019-01-04 | 2019-01-05 || succeeded | 2019-01-06 | 2019-01-06 |+--------------+--------------+--------------+结果忽略了2018年的记录,因为我们只关心从2019-01-01到2019-12-31的记录从 2019-01-01 到 2019-01-03 所有任务成功,系统状态为 "succeeded"。从 2019-01-04 到 2019-01-05 所有任务失败,系统状态为 "failed"。从 2019-01-06 到 2019-01-06 所有任务成功,系统状态为 "succeeded"。

解题思路:核心方法与上题一样

(1)使用union all合并两个表结果(相当于比第二题多了个state列)

(2)剩下思路同第二题,但是要维护一个@state状态,只有当日期连续增加,同时@sate不变的时候才能保持num不变

select period_state, min(task_date) as start_date, max(task_date) as end_datefrom( select period_state,task_date, case when datediff(task_date,@date) = 1 and @state = period_state then @num := @num else @num := @num + 1 end num, @date := task_date, @state := period_state from ( select 'succeeded' as period_state,success_date as task_date from Succeeded where success_date between '2019-01-01' and '2019-12-31' union all select 'failed' as period_state,fail_date as task_date from Failed where fail_date between '2019-01-01' and '2019-12-31' order by task_date ) t1,(select @date := null,@num := 0,@state := null) t2)t3group by period_state,numorder by start_date

4、体育馆流量

X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)。

请编写一个查询语句,找出人流量的高峰期。高峰期时,至少连续三行记录中的人流量不少于100。

例如,表stadium:

+------+------------+-----------+| id | visit_date | people |+------+------------+-----------+| 1 | 2017-01-01 | 10 || 2 | 2017-01-02 | 109 || 3 | 2017-01-03 | 150 || 4 | 2017-01-04 | 99 || 5 | 2017-01-05 | 145 || 6 | 2017-01-06 | 1455 || 7 | 2017-01-07 | 199 || 8 | 2017-01-08 | 188 |+------+------------+-----------+

对于上面的示例数据,输出为:

+------+------------+-----------+| id | visit_date | people |+------+------------+-----------+| 5 | 2017-01-05 | 145 || 6 | 2017-01-06 | 1455 || 7 | 2017-01-07 | 199 || 8 | 2017-01-08 | 188 |+------+------------+-----------+

提示:每天只有一行记录,日期随着 id 的增加而增加。

利用自定义变量求解

1.定义一个变量cnt,如果people >= 100,加1,否则变为0,这样如果连续三行记录大于等于100,就会出现连续增加的序列

2.利用id是有序增加的,找出人流量的高峰期

select distinct s.*from stadium s,( select id,visit_date,people, case when people >= 100 then @cnt := @cnt + 1 else @cnt := 0 end as cnt from stadium,(select @cnt:=0)a)bwhere b.cnt >= 3 and s.id between b.id-b.cnt+1 and b.id

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    807

    浏览量

    46932
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67828

原文标题:经典 SQL 笔试面试题:求解连续区间

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    OCAD应用:二组元连续变焦系统

    二组元连续变焦系统实质上是对三组元变焦补偿形式的简化。他利用后面的变焦组的轴向移动产生系统变焦比,由于变焦系统运动产生的相面位移量有前组位移补偿。该形式变焦系统的前组不是固定组,为此对此类系统
    发表于 04-21 08:23

    OCAD应用:四组元连续变焦系统

    | | 四组元连续变焦系统是在三组元连续变焦系统的基础上增加了一个变焦组分担系统像面位移,由两个变焦组一个补偿组,再加一个前固定组和后固定组组成。两个变焦组可以接连在一起,第二个变焦组固定不动,也
    发表于 04-17 08:20

    固定翼无人机激光传感器的价格区间

    固定翼无人机激光传感器价格跨度极大,从几十元到数万元以上不等,核心取决于功能类型、性能参数与集成度。以下按用途分类给出近期最新价格区间与关键影响因素,便于选型参考。
    的头像 发表于 01-26 14:49 380次阅读
    固定翼无人机激光传感器的价格<b class='flag-5'>区间</b>

    油气集输管道极性排流器 智能测试桩排流锌带阳极直流固态耦合

    耦合
    邦信防腐郭亚哲
    发布于 :2025年11月17日 19:15:59

    薄膜电容的关键词是什么知道吗?

    薄膜电容是一种以金属箔作为电极,以聚乙酯、聚丙烯、聚苯乙烯等塑料薄膜作为电介质的电容器,在电子电路中具有重要作用。薄膜电容有哪些关键词知道吗?
    的头像 发表于 10-13 15:30 646次阅读
    薄膜电容的关键词是什么<b class='flag-5'>你</b><b class='flag-5'>知道</b>吗?

    知道板卡厂商参与芯片研发的α阶段意味着什么?

    大家都知道芯片很重要,但是否知道一颗芯片从设计构思到最终量产,需要经历怎样一个漫长的过程吗?
    的头像 发表于 09-24 17:08 7742次阅读
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>板卡厂商参与芯片研发的α阶段意味着什么?

    工业人形机器人价格区间:赋能智能制造的新选择

    工业人形机器人价格区间受到技术先进性、功能多样性和应用场景复杂度的共同影响。富唯智能通过自研核心技术赋予机器人高度智能和灵活性,帮助企业更好地应对多任务协同和柔性制造需求。对于寻求智能制造升级的企业
    的头像 发表于 08-27 17:39 1531次阅读
    工业人形机器人价格<b class='flag-5'>区间</b>:赋能智能制造的新选择

    知道光耦的特性参数包括哪些吗?

    知道光耦的特性参数包括哪些吗? 一、输入特性参数 正向工作电压(Forward Voltage):在给定的工作电流下,LED本身的压降。 反向电压(Reverse Voltage):LED所能承受
    的头像 发表于 07-31 09:44 2121次阅读
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>光耦的特性参数包括哪些吗?

    CST求解器选择指南:瞬态(T)、频域(F)还是积分方程(I)

    CST求解器选择指南:瞬态、频域还是积分方程?详解CST MWS三种核心求解器的特点和最佳应用场景,帮助您选择合适的求解器提升仿真效率
    的头像 发表于 07-25 14:24 1196次阅读
    CST<b class='flag-5'>求解</b>器选择指南:瞬态(T)、频域(F)还是积分方程(I)

    已收藏!需要知道的57个常用树莓派命令!

    初次使用树莓派并不总是那么容易,因为可能还没有使用命令行的习惯。然而,终端命令是必不可少的,而且通常比通过图形用户界面(GUI)操作更高效。那么,有哪些重要的命令是应该知道的呢?有相当多的命令
    的头像 发表于 07-23 18:36 1289次阅读
    已收藏!<b class='flag-5'>你</b>需要<b class='flag-5'>知道</b>的57个常用树莓派命令!

    当仿真计算总是不收敛,的模型可能需要Abaqus非线性分析

    "计算不收敛”、“求解发散”、“出现负特征值”……对于许多仿真工程师来说,这些来自求解器的红色警告信息是工作中最令人沮丧的“拦路虎”。我们常常下意识地检查网格质量、边界条件或是载荷步,但如果这些
    的头像 发表于 07-22 14:55 772次阅读

    在友晶DE1-SOC开发板实现Chirikov标准映射求解

    该项目是在友晶DE1-SOC开发板实现Chirikov标准映射的求解器,并将其应用于图像加密和解密的概念验证。
    的头像 发表于 07-07 15:22 2006次阅读
    在友晶DE1-SOC开发板实现Chirikov标准映射<b class='flag-5'>求解</b>器

    FPGA使用Cordic算法求解角度正余弦值

    在进行坐标变换的时候,需要计算角度的正余弦值,而在FPGA中是不能直接进行求解的,需要采用其它的方式进行求解
    的头像 发表于 06-19 09:54 1536次阅读
    FPGA使用Cordic算法<b class='flag-5'>求解</b>角度正余弦值

    知道船用变压器有哪些吗?

    在船舶和海洋平台上,电力系统的稳定运行至关重要,而船用变压器作为其中的关键设备,其种类繁多,各具特点。知道船用变压器有哪些吗?让我们一起来揭开它们的神秘面纱。CSD船用变压器是船舶供电系统中
    的头像 发表于 06-01 00:00 865次阅读
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>船用变压器有哪些吗?

    使用USB控制中心下载固件遇到的问题怎么解决?

    我使用 USB 控制中心下载了固件,program-fx3-iic-eeprom。但是当我需要重置新下载固件时,出现了请重置的设备来下载固件。我不知道怎么解决?求解
    发表于 05-27 06:35