当前位置: 代码迷 >> Oracle技术 >> sql语句,求优化,有表有数据,多谢大侠
  详细解决方案

sql语句,求优化,有表有数据,多谢大侠

热度:43   发布时间:2016-04-24 08:35:48.0
sql语句,求优化,有表有数据,谢谢大侠!
表结构:(每个人每次的交易都会存入这张表)
table1:
type: varchar2 number date number varchar2
tranId tranSrlNum tranDate tranAmt pID
  1 1 10/10/2011 20 1234567
  1 2 10/10/2011 10 1234567
  2 1 10/10/2011 10 1234567
  2 2 10/10/2011 10 1234567
  2 3 10/10/2011 15 1234567 -- 目标记录
  1 1 09/09/2011 10 1234567  
  1 2 09/09/2011 5 1234567
  1 1 08/09/2011 6 1234567
  .......
  1 1 10/10/2011 100 8888888
  .......

tranId tranSrlNum tranDate 是该表的联合主键, 求每个人最近发生的一次交易记录。

如:pID = 1234567(外键,唯一表示一个人), 怎么把目标记录选出来啊 ? 用一条sql 语句实现
SQL code
select *    from table1   where (to_char(tranDate,'dd-mm-yyy')||(trim(tranId))||(trim(tranSrlNum)) = (     select max((to_char(tranDate,'dd-mm-yyy')||(trim(tranId))||(trim(tranSrlNum)) )    from table1   where pID = '1234567'   )

上面的得到了正确结果,但是用到自己的function中,加了这段逻辑,结果跑了很长时间没跑出结果,

求解!

------解决方案--------------------
SQL code
select *  from( select row_number()over(partition by pID order by tranDate desc) row_,               t.*          from table1) where row_ = 1;
------解决方案--------------------
补充一句,排序条件 order by tranDate desc 我分析只需要这一个条件。
你根据你自己的业务情况,改改吧。
------解决方案--------------------
探讨
SQL code

select *
from( select row_number()over(partition by pID order by tranDate desc) row_,
t.*
from table1)
where row_ = 1;

------解决方案--------------------
SQL code
select *  from( select row_number()over(partition by pID order by tranDate desc) row_,               t.*          from table1 ) where row_ = 1 and pID = '1234567'
------解决方案--------------------
SQL code
select *  from( select row_number()over(partition by pID order by tranDate desc) row_,               t.*          from table1) where row_ = 1 and pid=''  --加条件
------解决方案--------------------
select nt.pid,nt.trandate,nt.tranid,nt.transrlnum,nt.tranAmt from 
(select t.pid,t.trandate,t.tranid,t.transrlnum,t.tranAmt,
rank() over(partition by t.pid order by t.trandate desc,t.tranid desc,t.transrlnum desc) r
from table1 t) nt
where nt.r=1 and nt.pid='1234567'

测试通过,给分吧。
  相关解决方案