Oracle over函数

oracle over函数简介:[url]http://blog.csdn.net/zljjava/article/details/8212253[/url],
[url]http://www.cnblogs.com/sumsen/archive/2012/05/30/2525800.html[/url]
实例(每个分组第一条记录):
获取每个分组(以DT.S_ACCNO,"SUBSTR"(DT.S_ACCDATE,1,6)分组),以DT.S_ACCNO,DT.S_ACCDATE 为倒序的排名第一的记录
SELECT dt.KJKMDM,dt.S_TRECODE,dt.S_ACCNO,dt.N_MONEYTODAY ,dt.S_ACCDATE, DF.GKJB  FROM 
(SELECT DM.KJKMDM,TI.S_TRECODE,TI.S_ACCNO,TI.N_MONEYTODAY ,TI.S_ACCDATE,RANK()
OVER (partition by TI.S_ACCNO,"SUBSTR"(TI.S_ACCDATE,1,6) ORDER BY TI.S_ACCNO,TI.S_ACCDATE DESC) AS rn FROM TIPS_LIB_INVENTORY_DAILY ti
LEFT JOIN DM_ACCOUNT dm ON DM.KJZH = TI.S_ACCNO) dt LEFT JOIN DM_FISC df ON DT.S_TRECODE = DF.GKDM WHERE rn=1


rank()排序函数根据partition by DT.S_ACCNO,"SUBSTR"(DT.S_ACCDATE,1,6) 分组,根据order by DT.S_ACCNO,DT.S_ACCDATE desc再排序
另一种方法取每个分组中的第一
SELECT dt.KJKMDM,dt.S_TRECODE,dt.S_ACCNO,dt.N_MONEYTODAY ,dt.S_ACCDATE, DF.GKJB  FROM 
(SELECT DM.KJKMDM,TI.S_ACCNO,TI.N_MONEYTODAY ,TI.S_ACCDATE,TI.S_TRECODE FROM
(select t.s_accdate, t.s_accno,t.n_moneytoday,t.S_TRECODE from tips_lib_inventory_daily t
inner join
(select substr(t.s_accdate,1,6) as month, [color=red]max(t.s_accdate)as s_accdate[/color] ,t.s_accno from tips_lib_inventory_daily t
[color=red]group by substr(t.s_accdate,1,6),t.s_accno) b
on t.s_accdate = b.s_accdate and t.s_accno = b.s_accno) ti
LEFT JOIN DM_ACCOUNT dm ON DM.KJZH = TI.S_ACCNO ) dt LEFT JOIN DM_FISC df ON DT.S_TRECODE = DF.GKDM ORDER BY DT.S_ACCNO,DT.S_ACCDATE

这种思想是,先求分组中的最大max(t.s_accdate)然后再去inner join取与最大值相等的记录
第二种方法速度更快,剔除了不必要的记录,第一种要对所有排序,再去每个分组的第一条记录
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值