89,SQL训练之,力扣,1285. 找到连续区间的开始和结束数字

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,SQL解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

表: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开窗的运用

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值