orcle分析函数

一、问题描述:

关务里拆分清单时要求:合并同一表头对应表体的 项号、币制、产销国(地区),将三个字段相同的数据归为一项,并生成一个递增的商品序号。从1开始。

解决方法:(DENSE_RANK分析函数)

              SELECT to_number(DENSE_RANK() OVER (PARTITION BY HEAD_OID ORDER BY HEAD_OID,EM_G_NO,CURR,COUNTRY_CODE)) as id

                     FROM GW_CUSTOMS_BILL_LIST_PRE;
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序)  不存在相同序号 如: 1,2,3,4
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)  如:1 ,2 ,2 ,4
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。 如:1 ,2 ,2 ,3

PARTITION BY:分组条件,就是按哪些字段进行分组

ORDER BY:组内排序


二、问题描述
问题描述:B表:为币制表,有 币制、日期 字段,同一个币制在不同时期的汇率是不一样的;

A表:有 总价、币制、申报日期 字段。

要求:

A表根据币制关联B表取汇率,将总价转换成美元总价。

币制取汇率方法:

第一步(关联):关联币制得出记录(A的1条记录对就多条B的记录,结果字段:A.申报日期,A.币制,B.日期,B.汇率)

第二步(筛选):筛选出A表的申报日期大于B表日期(汇率对应的日期必须在申报日期之前:B.日期<A.申报日期)

第三步(取汇率):同一币制取B表中最晚日期对应的汇率。


解决方法:(分析函数)

select distinct a.oid, a.curr,a.dec_total,a.inserttime,b.org_curr,b.input_er,

a.dec_total/( FIRST_VALUE(B.tax) OVER(PARTITION BY B.org_curr ORDER BY B.eff_date desc)) from gw_customs_bill_list_pre a,

 GW_INFO_TAX b where a.curr=b.org_curr and a.inserttime>b.eff_date
 

语法:

FIRST_VALUE(取值字段) OVER(PARTITION BY 分组字段 ORDER BY 排序字段)) from 表名

按“分组字段”进行分组,排“排序字段”排序,

FIRST_VALUE()取出“取值字段”记录中最大的值。

三、按关健字分组,排序后,加序号。

select exchange_rate_date, base_curr, change_curr,
row_number() over(partition by exchange_rate_date, base_curr, change_curr order by modify_date) id
FROM bi_exchange_rate

posted @ 2012-02-03 11:32  丁焕轩  阅读(574)  评论(0编辑  收藏  举报