现在我有个表 table1 ,
记录一个月内,每个号码拨打的长途地
call_num area
号码 地域
132 深圳
123 北京
123 北京
123 北京
132 深圳
132 上海
145 上海
145 上海
123 广州
132 广州
145 广州
145 深圳
123 广州
132 北京
123 深圳
123 深圳
123 北京
132 北京
132 上海
145 苏州
145 苏州
123 广州
132 苏州
145 苏州
145 苏州
123 广州 但是我现在需要统计构建这样一个结果表call_num long_addr_1 long_addr_2 long_addr3
号码 长途地1 长途地2 长途地3即把当月每个号码拨打次数最多那3个长途地给列出来,并且形成上面的表格
该如何构建呢例如对于号码123 ,当月的数据就可能是
call_num long_addr_1 long_addr_2 long_addr3
号码 长途地1 长途地2 长途地3
----------------------------------------------
123 北京 深圳 广州
记录一个月内,每个号码拨打的长途地
call_num area
号码 地域
132 深圳
123 北京
123 北京
123 北京
132 深圳
132 上海
145 上海
145 上海
123 广州
132 广州
145 广州
145 深圳
123 广州
132 北京
123 深圳
123 深圳
123 北京
132 北京
132 上海
145 苏州
145 苏州
123 广州
132 苏州
145 苏州
145 苏州
123 广州 但是我现在需要统计构建这样一个结果表call_num long_addr_1 long_addr_2 long_addr3
号码 长途地1 长途地2 长途地3即把当月每个号码拨打次数最多那3个长途地给列出来,并且形成上面的表格
该如何构建呢例如对于号码123 ,当月的数据就可能是
call_num long_addr_1 long_addr_2 long_addr3
号码 长途地1 长途地2 长途地3
----------------------------------------------
123 北京 深圳 广州
解决方案 »
- oracle归档日志
- ORA-12518: TNS: 监听程序无法分发客户机 错误
- 有大约70万条数据需要更新,用游标的话效率会很低吗?
- oracle11g安装问题
- oracle 如何修改带时间的日期字段
- 论坛的各位兄弟姐妹们,你们知道如何把sybase数据库通过OCI移植到oracle数据库中吗?
- 请教SQL排序!!
- 帮我看看这个from什么意思啊,谢谢
- 错误:ORA-01000: maximum open cursors exceeded
- oracle数据库链接不释放(重金求解)
- 请教oracle 10g通过0DBC连接SQL SERVER2000的问题
- 怎么成为数据库应用高手(j2ee数据库应用系统开发)
from tb
group by call_num;你看这样是否符合你的要求?
(SELECT call_num, area, call_count,
ROW_NUMBER () OVER (PARTITION BY call_num ORDER BY call_count DESC) rank1
FROM (SELECT call_num, area, COUNT (*) call_count
FROM table1
GROUP BY call_num, area))
SELECT num1.call_num, num1.area, num2.area, num3.area
FROM (SELECT call_num, area, rank1
FROM a1
WHERE rank1 = 1) num1
JOIN
(SELECT call_num, area, rank1
FROM a1
WHERE rank1 = 2) num2 ON (num1.call_num = num2.call_num)
JOIN
(SELECT call_num, area, rank1
FROM a1
WHERE rank1 = 3) num3 ON (num1.call_num = num3.call_num)
(select num,area,count(1) cnt
from tablog
group by num,area
order by cnt desc having rownum <2) a,
(select
select num,area,count(1) cnt
from tablog
group by num,area
order by cnt desc having rownum <3) b,
(select
select num,area,count(1) cnt
from tablog
group by num,area
order by having rownum <4) c
where a.num = b.num and a.num = c.num and
b.area <> a.area and a.area <> b.area and a.area <> c.area);
应该能符合你的功能要求;但通话记录这类张数据量估计会很大,最好是使用过程来实现
SQL> insert into table1 values(132,'深圳');已创建 1 行。SQL> insert into table1 values(123,'北京');已创建 1 行。SQL> insert into table1 values(123,'北京');已创建 1 行。SQL> insert into table1 values(123,'北京');已创建 1 行。SQL> insert into table1 values(132,'深圳');已创建 1 行。SQL> insert into table1 values(132,'上海');已创建 1 行。SQL> insert into table1 values(145,'上海');已创建 1 行。SQL> insert into table1 values(145,'上海');已创建 1 行。SQL> insert into table1 values(123,'广州');已创建 1 行。SQL> insert into table1 values(132,'广州');已创建 1 行。SQL> insert into table1 values(145,'广州');已创建 1 行。SQL> insert into table1 values(145,'深圳');已创建 1 行。SQL> insert into table1 values(123,'广州');已创建 1 行。SQL> insert into table1 values(132,'北京');已创建 1 行。SQL> insert into table1 values(123,'深圳');已创建 1 行。SQL> insert into table1 values(123,'深圳');已创建 1 行。SQL> insert into table1 values(123,'北京');已创建 1 行。SQL> insert into table1 values(132,'北京');已创建 1 行。SQL> insert into table1 values(132,'上海');已创建 1 行。SQL> insert into table1 values(145,'苏州');已创建 1 行。SQL> insert into table1 values(145,'苏州');已创建 1 行。SQL> insert into table1 values(123,'广州');已创建 1 行。SQL> insert into table1 values(132,'苏州');已创建 1 行。SQL> insert into table1 values(145,'苏州');已创建 1 行。SQL> insert into table1 values(145,'苏州');已创建 1 行。SQL> insert into table1 values(123,'广州');已创建 1 行。SQL>
SQL> select call_num,wmsys.wm_concat(area||cnt) long_addr
2 from (
3 select call_num,area,count(1) as cnt,row_number() over(partition by call_num order by call_num,count(1) desc) as rn
4 from table1
5 group by call_num,area
6 )
7 where rn<=3
8 group by call_num; CALL_NUM LONG_ADDR
---------- --------------------------------------------------------------------------------
123 北京4,广州4,深圳2
132 深圳2,上海2,北京2
145 苏州4,广州1,上海2SQL>