数据库里数据结构是这样的: 大分类 小分类
A NULL
A NULL
A 语文
A 语文
A 数学
A NULL
B 自然
B 自然
B 自然
C NULL
D NULL要求:
得出相邻的相同的数据的个数
要求结果
大分类 小分类 个数
A NULL 2
A NULL 2
A 语文 2
A 语文 2
A 数学 1
A NULL 1
B 自然 3
B 自然 3
B 自然 3
C NULL 1
D NULL 1我记得有函数可以实现,请高手赐教。
A NULL
A NULL
A 语文
A 语文
A 数学
A NULL
B 自然
B 自然
B 自然
C NULL
D NULL要求:
得出相邻的相同的数据的个数
要求结果
大分类 小分类 个数
A NULL 2
A NULL 2
A 语文 2
A 语文 2
A 数学 1
A NULL 1
B 自然 3
B 自然 3
B 自然 3
C NULL 1
D NULL 1我记得有函数可以实现,请高手赐教。
select ta.p1,ta.p2,tb.p4
from ta,
(select p1,p2,count(p3) p4
from (
select p1,p2,decode(p2,null,'1',p2) p3
from ta)
group by p1,p2) tb
where ta.p1=tb.p1(+)
and ta.p2=tb.p2(+)
order by p1
1 A NULL
2 A NULL
3 A 语文
4 A 语文
5 A 数学
6 A NULL
7 B 自然
8 B 自然
9 B 自然
10 C NULL
11 D NULL排序就是按照排序NO排列的,求之前说的结果
SQL> with ta as(
2 select 1 id,'A' p1,'NULL' p2 from dual union all
3 select 2,'A','NULL' from dual union all
4 select 3,'A','语文' from dual union all
5 select 4,'A','语文' from dual union all
6 select 5,'A','数学' from dual union all
7 select 6,'A','NULL' from dual union all
8 select 7,'B','自然' from dual union all
9 select 8,'B','自然' from dual union all
10 select 9,'B','自然' from dual union all
11 select 10,'C','NULL' from dual union all
12 select 11,'D','NULL' from dual)
13 select ta.id,ta.p1,ta.p2,tb.p3
14 from ta,(
15 select id,p1,p2,count(decode(p2,null,'1',p2)) over (partition by p1,p2 order by p1,p2) p3
16 from ta
17 group by id,p1,p2) tb
18 where ta.id=tb.id(+)
19 and ta.p1=tb.p1(+)
20 and ta.p2=tb.p2(+)
21 order by id
22 /
ID P1 P2 P3
---------- -- ---- ----------
1 A NULL 3
2 A NULL 3
3 A 语文 2
4 A 语文 2
5 A 数学 1
6 A NULL 3
7 B 自然 3
8 B 自然 3
9 B 自然 3
10 C NULL 1
11 D NULL 1
11 rows selected
select id,p1,p2,
count(decode(p2,null,'1',p2)) over (partition by p1,p2 order by p1,p2) p3
from ta
group by id,p1,p2
order by id
ID P1 P2 P3
---------- -- ---- ----------
1 A NULL 3
2 A NULL 3
3 A 语文 2
4 A 语文 2
5 A 数学 1
6 A NULL 3
7 B 自然 3
8 B 自然 3
9 B 自然 3
10 C NULL 1
11 D NULL 1
我想要的结果是:1 A NULL 2
2 A NULL 2因为A NULL相邻的只有2个下面不相邻的不能算进去
select 1 id,'A' p1,'NULL' p2 from dual union all
select 2,'A','NULL' from dual union all
select 3,'A','语文' from dual union all
select 4,'A','语文' from dual union all
select 5,'A','数学' from dual union all
select 6,'A','NULL' from dual union all
select 7,'B','自然' from dual union all
select 8,'B','自然' from dual union all
select 9,'B','自然' from dual union all
select 10,'C','NULL' from dual union all
select 11,'D','NULL' from dual
)
select id,p1,p2,count(*)over(partition by p1,p2,id-rn) cnt from(
select id,p1,p2,row_number()over(partition by p1,p2 order by id) rn from tab
)
order by idID P1 P2 CNT
-----------------
1 A NULL 2
2 A NULL 2
3 A 语文 2
4 A 语文 2
5 A 数学 1
6 A NULL 1
7 B 自然 3
8 B 自然 3
9 B 自然 3
10 C NULL 1
11 D NULL 1