比如:+----+-----+
| Id | Num |
+----+-----+
| 1 | 4 |
| 2 | 5 |
| 3 | 6 |
| 4 | 9 |
| 5 | 0 |
| 6 | 0 |
| 7 | 3 |
| 8 | 1 |
| 9 | 7 |
|10 | 2 |
+----+-----+
要查询出0跟9连续出现的次数
问题描述不清晰,麻烦说清楚
这个问题如果你不用存储过程的话建议不用sql处理。
将完整的数据传送到后台将num字段存入数组
循环判断一下
很轻易就搞定了
把num在0跟9之间的数据先筛选出来然后根据id是否连续确定次数
https://blog.csdn.net/SoWhatWorld/article/details/104859986
怎样算连续?是id连着?比如说0,id是5和6,算连续?
试试这样
select a.num, count(a.num) as '连续出现次数'
from table a
group by a.num
having count(a.num) = max(a.id)-min(a.id)+1 --次数=连续id的差+1
我来了,来CSDN解决最多的就是这种问题了。
1、创建表
create table test111(
id number, val number
)
2、插入测试数据
insert into TEST111 (ID, VAL)
values ('1', '10');
insert into TEST111 (ID, VAL)
values ('2', '18');
insert into TEST111 (ID, VAL)
values ('3', '10');
insert into TEST111 (ID, VAL)
values ('4', '10');
insert into TEST111 (ID, VAL)
values ('5', '10');
insert into TEST111 (ID, VAL)
values ('6', '10');
insert into TEST111 (ID, VAL)
values ('7', '0');
insert into TEST111 (ID, VAL)
values ('8', '0');
insert into TEST111 (ID, VAL)
values ('9', '0');
insert into TEST111 (ID, VAL)
values ('10', '2');
insert into TEST111 (ID, VAL)
values ('11', '2');
insert into TEST111 (ID, VAL)
values ('12', '9');
insert into TEST111 (ID, VAL)
values ('13', '4');
insert into TEST111 (ID, VAL)
values ('14', '9');
insert into TEST111 (ID, VAL)
values ('15', '9');
insert into TEST111 (ID, VAL)
values ('16', '0');
insert into TEST111 (ID, VAL)
values ('17', '7');
commit;
3、输出结果
分别输出0,9,10这三个数字的连续出现的最大次数。
如果不是最大次数,可以去掉最外层的group by。
select val, max(res)
from (SELECT val, MAX(id) - MIN(id) + 1 res
FROM (
--dataset1
select *
from TEST111 j
where j.val in (0, 9, 10)
--end dataset1
) t
START WITH NOT EXISTS (SELECT 1
FROM (
--dataset1
select *
from TEST111 j
where j.val in (0, 9, 10)
--end dataset1
) b
WHERE b.id = t.id - 1)
CONNECT BY PRIOR t.id = t.id - 1
GROUP BY rownum - LEVEL, val)
group by val
如有更多问题,欢迎联系探讨,QQ/VX:316187205
SELECT (select COUNT(*)
from (select *
from (select a.id,
a.num,
LEAD(a.num, 1) over(order by id asc) as num1
from test a))
where (num = 0 or num = 9)
and (num1 = 0 or num1 = 9)) -
(SELECT COUNT(*)
FROM (SELECT T.ID, LEAD(T.ID, 1) OVER(ORDER BY ID ASC) AS ID2
FROM (select *
from (select *
from (select a.id,
a.num,
LEAD(a.num, 1) over(order by id asc) as num1
from test a))
where (num = 0 or num = 9)
and (num1 = 0 or num1 = 9)) T)
WHERE ID2 - ID = 1)
FROM DUAL
0和9连续出现的概念是啥?是0和9连续就可以 还是0 和 9 分别统计 ,连续次数是什么意思,比如 123 都是 0 算两次连续还是一次连续 ,我这个是最难算的一种统计,如果连续接连续 则计算为一次的那种
select t1.num, count(t2.num) from test t1 left join (
(select id,num
from (select *
from (select a.id,
a.num,
LEAD(a.num, 1) over(order by id asc) as num1
from test a))
where num =num1
minus
select id, num
from (SELECT T.ID, LEAD(T.ID, 1) OVER(ORDER BY ID ASC) AS ID2, num
FROM (select t.*,
row_number() over(partition by NUM order by id asc) rn
from (select id, num
from (select *
from (select a.id,
a.num,
LEAD(a.num, 1) over(order by id asc) as num1
from test a))
where num = num1) t) t)
where id2 - id = 1)) t2 on t1.id =t2.id where (t1.num=0 or t1.num=9)
group by t1.num
group by num 这是计算 0和 9分别连续出现次数的。 连续连的超过两个数的,计算为1次