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