- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Logs
+---------------+---------+ | Column Name | Type | +---------------+---------+ | log_id | int | +---------------+---------+ id 是上表具有唯一值的列。 上表的每一行包含日志表中的一个 ID。编写解决方案,得到
Logs
表中的连续区间的开始数字和结束数字。返回结果表按照
start_id
排序。结果格式如下面的例子。
示例 1:
输入: 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 在表中。
三,建表语句
Create table If Not Exists Logs (log_id int)
Truncate table Logs
insert into Logs (log_id) values ('1')
insert into Logs (log_id) values ('2')
insert into Logs (log_id) values ('3')
insert into Logs (log_id) values ('7')
insert into Logs (log_id) values ('8')
insert into Logs (log_id) values ('10')
四,分析
题解:
表1 日志表
字段 登录id
求 连续登录的id 开始数值和结束数字
第一步,给表排序
select * from logs order by log_id
第二步,创建一个新列 生成一个连续的序列
with t1 as (
select * from logs order by log_id
),t2 as (
select log_id,
row_number() over () rn,
log_id-(row_number() over () ) rn1
from t1) select * from t2
第三步,以差值分组,取每组的最大值和最小值 然后开窗
最后一步 对开始id和结束id 去重
五,SQL解答
with t1 as (
select * from logs order by log_id
),t2 as (
select log_id,
row_number() over () rn,
log_id-(row_number() over () ) rn1
from t1
),t3 as (
select
log_id,rn,rn1,
min(log_id) over (partition by rn1) start_id,
max(log_id) over (partition by rn1) end_id
from t2
),t4 as (
select start_id,end_id from t3 group by start_id,end_id
order by start_id
)
select * from t4;
六,验证
七,知识点总结
- 连续性的问题 排序取差值
- 如果差值是相同的 则表示是连续的
- 如果差值非相同 则必然不是连续的
- 然后以差值分组 取最小值和最大值
- 最后去重 映射这个列
- 连续值的sql解法运用
- row_number开窗的运用
- min开窗的运用
- max开窗的运用
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用