HQL面试题练习 —— 求连续段的最后一个数及每个连续段的个数

题目来源:拼多多。

1 题目


有一张表t_id记录了id,id不重复,但是会存在间断,求出连续段的最后一个数及每个连续段的个数。

+-----+
| id  |
+-----+
| 1   |
| 2   |
| 3   |
| 5   |
| 6   |
| 8   |
| 10  |
| 12  |
| 13  |
| 14  |
| 15  |
+-----+

2 建表语句


--建表语句
CREATE TABLE t_id (
id bigint COMMENT 'ID'
) COMMENT 'ID记录表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
;
-- 插入数据
insert into t_id(id)
values
(1),
(2),
(3),
(5),
(6),
(8),
(10),
(12),
(13),
(14),
(15);

3 题解


第一步:lag()函数进行开窗计算与上一行的差值。

select
    id,
    id-lag(id) over(order by id) as diff
from
    t_id;

执行结果

在这里插入图片描述

第二步:根据diff进行判断,如果差值为1代表连续赋值为0,否则代表不连续赋值为1,然后使用sum()进行累积计算,获得分组依据字段。

select
    id,
    if(diff=1,0,1) as judge,
    sum(if(diff=1,0,1)) over(order by id) as group_type
from
    (select
        id,
        id-lag(id) over(order by id) as diff
    from
        t_id)t

执行结果

在这里插入图片描述
第三步:得出结果。

select
    group_type,
    max(id) as max_part,
    count(id) as num_part
from
    (select
        id,
        if(diff=1,0,1) as judge,
        sum(if(diff=1,0,1)) over(order by id) as group_type
    from
        (select
            id,
            id-lag(id) over(order by id) as diff
        from
            t_id)t)tt
group by group_type
order by group_type;

执行结果

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 01:30:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 01:30:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 01:30:07       82 阅读
  4. Python语言-面向对象

    2024-06-08 01:30:07       91 阅读

热门阅读

  1. 【C++】list模拟实现

    2024-06-08 01:30:07       22 阅读
  2. 瀚高数据库相关设置

    2024-06-08 01:30:07       31 阅读
  3. go 源码学习1:scanner学习

    2024-06-08 01:30:07       29 阅读
  4. Python怎么翻转:深度探索与技巧剖析

    2024-06-08 01:30:07       32 阅读
  5. 聚类层次【python,机器学习,算法】

    2024-06-08 01:30:07       30 阅读
  6. 数据结构:顺序栈

    2024-06-08 01:30:07       29 阅读
  7. 云计算导论(3)---分布式文件系统

    2024-06-08 01:30:07       31 阅读
  8. redis基本命令

    2024-06-08 01:30:07       27 阅读
  9. C++面试题其三

    2024-06-08 01:30:07       35 阅读