1.编写一个 SQL 查询,查找NUM字段中至少连续出现两次的数字。

例如,给定上面的 lx_01 表,里面的数据都是按照先后顺序插入的,现在需要找到NUM字段连续出现两次及以上的数值 。
实现下图中的效果,1 和2是连续出现至少两次的数字。

能力点:如何判断连续记录的数据。
--创建练习表
create table LX_01
(
id NUMBER,
num NUMBER
);
--插入数据
insert into lx_01 (ID, NUM) values (100001, 1);
commit;
insert into lx_01 (ID, NUM) values (100002, 1);
commit;
insert into lx_01 (ID, NUM) values (100003, 1);
commit;
insert into lx_01 (ID, NUM) values (100004, 2);
commit;
insert into lx_01 (ID, NUM) values (100005, 1);
commit;
insert into lx_01 (ID, NUM) values (100006, 2);
commit;
insert into lx_01 (ID, NUM) values (100007, 2);
commit;
insert into lx_01 (ID, NUM) values (100008, 3);
commit;
insert into lx_01 (ID, NUM) values (100009, 4);
commit;
insert into lx_01 (ID, NUM) values (100010, 3);
commit;
方法一:
用oracle的row_number() over()函数
SELECT num, count(1) c
from (SELECT id,
num,
row_number() over(PARTITION BY num ORDER BY id) r,
id - row_number() over(PARTITION BY num ORDER BY id) bz
FROM lx_01) a
GROUP BY num, bz
having count(1) > 1
方法二:
直接用oracle的rownum
第一步:连续出现的条件就是序号是挨着的,那按照num 和 rownum 两个字段顺序排序
select a.num, rownum as row_num from lx_01 a order by a.num,rownum

第二步:如何判断是连续的?
select num,row_num as 原表行号,rownum as 排序后行号,(rownum - row_num) as 行号差
from (select a.num, rownum as row_num from lx_01 a order by a.num,rownum )

第三步:连续的记录 行号差是相同的。把这些挑出来
select num
from (select a.num, rownum as row_num from lx_01 a order by a.num,rownum )
group by num,(rownum - row_num)
having count(1) >1;
本文介绍如何使用Oracle SQL查询NUM字段中连续出现至少两次的数字。通过两种方法,包括利用row_number() over()函数和rownum,来找出符合条件的记录,并强调了判断连续记录的关键在于行号差值的判断。

2万+

被折叠的 条评论
为什么被折叠?



