免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5415 | 回复: 16
打印 上一主题 下一主题

oracle分析析function --NB [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-21 20:20 |只看该作者 |倒序浏览
本帖最后由 yobyin 于 2010-06-22 22:08 编辑

搞几个变态的报表...把多行转成一行,按一个column的排序后取前30%名

多行转一行
CREATE TABLE t_row_str(
ID INT,
col VARCHAR2(10));
INSERT INTO t_row_str VALUES(1,'a');
INSERT INTO t_row_str VALUES(1,'b');
INSERT INTO t_row_str VALUES(1,'c');
INSERT INTO t_row_str VALUES(2,'a');
INSERT INTO t_row_str VALUES(2,'d');
INSERT INTO t_row_str VALUES(2,'e');
INSERT INTO t_row_str VALUES(3,'c');
COMMIT;
SELECT * FROM t_row_str;
5.1
MAX + DECODE
适用范围:8i,9i,10g及以后版本
SELECT id,
MAX(decode(rn, 1, col, NULL)) ||
MAX(decode(rn, 2, ',' || col, NULL)) ||
MAX(decode(rn, 3, ',' || col, NULL)) str
FROM (SELECT id,
col,
row_number() over(PARTITION BY id ORDER BY col) AS rn
FROM t_row_str) t
GROUP BY id
ORDER BY 1;
5.2
ROW_NUMBER + LEAD
适用范围:8i,9i,10g及以后版本
SELECT id, str
FROM (SELECT id,
row_number() over(PARTITION BY id ORDER BY col) AS rn,
col || lead(',' || col, 1) over(PARTITION BY id ORDER BY col) ||
lead(',' || col, 2) over(PARTITION BY id ORDER BY col) ||
lead(',' || col, 3) over(PARTITION BY id ORDER BY col) AS str
FROM t_row_str)
WHERE rn = 1
ORDER BY 1;
5.3
MODEL
适用范围:10g及以后版本
SELECT id, substr(str, 2) str FROM t_row_str
MODEL
RETURN UPDATED ROWS
PARTITION BY(ID)
DIMENSION BY(row_number() over(PARTITION BY ID ORDER BY col) AS rn)
MEASURES (CAST(col AS VARCHAR2(20)) AS str)
RULES UPSERT
ITERATE(3) UNTIL( presentv(str[iteration_number+2],1,0)=0)
(str[0] = str[0] || ',' || str[iteration_number+1])
ORDER BY 1;
5.4
SYS_CONNECT_BY_PATH
适用范围:8i,9i,10g及以后版本
SELECT t.id id, MAX(substr(sys_connect_by_path(t.col, ','), 2)) str
FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
FROM t_row_str) t
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1
AND id = PRIOR id
GROUP BY t.id;
适用范围:10g及以后版本
SELECT t.id id, substr(sys_connect_by_path(t.col, ','), 2) str
FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
FROM t_row_str) t
WHERE connect_by_isleaf = 1
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1
AND id = PRIOR id;
5.5
WMSYS.WM_CONCAT
适用范围:10g及以后版本
这个函数预定义按','分隔字符串,若要用其他符号分隔可以用,replace将','替换。
SELECT id, REPLACE(wmsys.wm_concat(col), ',', '/') str
FROM t_row_str
GROUP BY id;

------------------取按列排名的指定记录
select * from (
  select t.*,cume_dist() over(order by t.score) cume_dist
  from testtable t)
where  cume_dist>=0.1 and cume_dist<=0.5 ;

oracle 分析function nb


select * from (
  select t.*,cume_dist() over(order by t.score) cume_dist
  from testtable t)
where  cume_dist>=0.1 and cume_dist<=0.5 ;

论坛徽章:
0
2 [报告]
发表于 2010-06-21 20:29 |只看该作者
分析函数:

ntile

功能描述:将一个组分为"表达式"的散列表示,例如,如果表达式=4,则给组中的每一行分配一个数(从1到4),如果组中有20行,则给前5行分配1,给下5行分配2等等。如果组的基数不能由表达式值平均分开,则对这些行进行分配时,组中就没有任何percentile的行数比其它percentile的行数超过一行,最低的percentile是那些拥有额外行的percentile。例如,若表达式=4,行数=21,则percentile=1的有6行,percentile=2的有5行等等。



sql@kokooa>select id,value,ntile(4) over (order by value) as

2 quartile from test017;


        ID      VALUE   QUARTILE

---------- ---------- ----------

         1        123          1

         3        345          1

         4        456         2

         5        567          3

         6        567          4


PERCENT_RANK

功能描述:和CUME_DIST(累积分配)函数类似,对于一个组中给定的行来说,在计算那行的序号时,先减1,然后除以n-1(n为组中所有的行数)。该函数总是返回0~1(包括1)之间的数。RANK函数对于等值的返回序列值是一样的

sql@kokooa>select id,value,percent_rank()over(order by id) as pr from test017;


        ID      VALUE         PR

---------- ---------- ----------

         1        123          0

         3        345        .25

         4        456         .5

         5        567        .75

         6        567         1

如果有重复元素呢?

sql@kokooa>select id,value,percent_rank()over(order by id) as pr from test017;


        ID      VALUE         PR

---------- ---------- ----------

         1        123          0

         1        234          0

         3        345         .4

        4        456         .6

         5        567         .8

         6        567          1


其中开头两行id重复。

sql@kokooa>select id,value,percent_rank()over(order by id) as pr from test017;


        ID      VALUE         PR

---------- ---------- ----------

         1        123          0

         2        234         .2

         3        345         .4

         3        456         .4

         5        567         .8

         6        567          1




sql@kokooa>select id,value,percent_rank()over(order by id) as pr from test017;


        ID      VALUE         PR

---------- ---------- ----------

         3        123          0

         3        234          0

         3        345          0

         3        456          0

         3        567          0

         6        567          1



继续测:

sql@kokooa>select id,value,percent_rank()over(order by id) as pr from test017;


        ID      VALUE         PR

---------- ---------- ----------

         3        123          0

         3        234          0

         3        345          0

         3        456          0

         5        567         .8

         6        567          1

应该是(5-1)/5=0.8 (6-1)/5=1;




Cume_dist

sql@kokooa>select id,value,cume_dist()over(order by id) as pr from test017;


        ID      VALUE         PR

---------- ---------- ----------

         3        123         .5

       3        234         .5

         3        345         .5

         5        456 .833333333

         5        567 .833333333

         6        567          1

应该是行数/总行数。如果有重复的,如上:则前3行是3/6 接着2行是5/6。被除数以重复行的最后一行的行数为准。

论坛徽章:
26
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:1315-16赛季CBA联赛之天津
日期:2016-12-12 10:44:23
3 [报告]
发表于 2010-06-22 08:50 |只看该作者
华为上研中心 就搞这个啊 ·

论坛徽章:
0
4 [报告]
发表于 2010-06-22 12:52 |只看该作者
为啥华为杭州没搞Oracle的

论坛徽章:
0
5 [报告]
发表于 2010-06-22 22:07 |只看该作者
select * from
(select t.* ,row_number() over (partition by groupid  order by score) rm  from  testtable t ) a where a.rm=1   这个去重的

论坛徽章:
0
6 [报告]
发表于 2010-06-25 13:09 |只看该作者
分析函数非常方便地简化了做报表的复杂度,向楼主学习

论坛徽章:
0
7 [报告]
发表于 2010-07-13 00:35 |只看该作者
select regexp_substr('[10000]/[100]*{100}', '[[:digit:]]{3,5}',1,1) from dual;

select regexp_substr('[10000]+[100]', '[[:digit:]]{3,5}',1,2) from dual;

论坛徽章:
0
8 [报告]
发表于 2010-07-13 00:42 |只看该作者
select regexp_substr('[10000]+[100]', '[[:digit:]]{3,5}',1,1) from dual;

select regexp_substr('[10000]+[100]', '[[:digit:]]{3,5}',1,2) from dual;



select regexp_substr('[10000]+[100]', '[[:digit:]]+',1,1) A from dual;
select regexp_substr('[10000]+[100]', '[[:digit:]]+',1,2) B from dual;

论坛徽章:
0
9 [报告]
发表于 2010-07-13 13:27 |只看该作者
正则表达式

论坛徽章:
0
10 [报告]
发表于 2010-07-14 14:04 |只看该作者
总结的不错,对弄报表的人很有用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP