Oracle中本行记录和上一行记录进行比较lead over 函数处理

遇到问题:多表关联查询,有一个要求是,同一保单号,对应多个投资产品Code.以及投资比例,每一个保单号有一个总的投资金额。要求同一保单号那一行,只有第一个总金额有值,剩下的code对应的总金额置空。

简述问题:如果本行记录和上一行记录,某字段值相同,则怎么处理,另外一列的值。

样例SQL如下。

   select rownum  序号 ,
ld.comcode 分公司,
'B2B' 来源,
ed.tranno 银行交易号,
(select bb.newcontno
from b2b_contno bb
where trim(bb.oldcontno) = trim(lc.contno)) 保单号新,
lc.contno 保单号旧,
lc.appntname 投保人,
ms.pol_status 保单状态,
ed.makedate 客户申请日期,
ms.UPD_DATE 保全受理日期,
lead(to_char(ed.fingetamt),(select count(*)-1 from EdorAPDetail),null) over (partition by lc.contno order by lc.contno) as 购买总金额,
ea.accountcode 基金代码,
(select b.CODE_DES from bankandinsurercodemapping b where b.COMCode = 'ICBC'
and b.CODETYPE = 'accounttype' and trim(b.BANK_CODE) = trim(ea.accountcode)) 基金名称,
ea.accountpercent 购买比例,
'现金' 支付方式,
ed.bankcode 银行代码,
ed.accnumber 账号,
ed.bak1 户名,
ld.name 营业单位,
la.agentcom 代理人编号,
la.name 代理人姓名,
ed.appntphone 投保人电话
from lccont lc, --日志表
lacom la, --银行代理机构表
edoraddinsure ed, --保全业务表
ldcom ld, --保险分公司表
B2B_ITF_T_POL_MST ms, --ODS推数表
EdorAPDetail ea where ed.funcflag in (1020)
and lc.agentcom = la.agentcom
and ld.comcode = la.managecom
and ms.comp_code=ld.comcode and trim(ed.bankcode) = trim(lc.newbankcode)
and ed.bankcode='' and trim(lc.contno) = trim(ed.contno)
and trim(ms.pol_no) = trim(ed.contno)
and trim(ea.contno) = trim(ed.contno)

核心处理要点:

lead(to_char(ed.fingetamt),(select count(*)-1 from EdorAPDetail),null)  over (partition by  lc.contno order by lc.contno) as 购买总金额,

心得:Oracle中lead (mm,1,null) over(partition by bb order by tt)函数。本行记录和上一行记录比较,partition by  lc.contno相同的话,就给ed.fingetamt置空。并按某某顺序。

上一篇:国际知名CSS Reset 总结


下一篇:Linux下配置QT环境