日期:2014-05-17  浏览次数:20886 次

求已一SQL语句
table 表结构如下
NAME     DATE              sk       ALL
A        2010-10-11        200      500             √
A        2010-08-12        100      500             √
A        2010-07-10        400      500             √
A        2010-05-06        30      500              ×
A        2010-01-01        299      500             ×
B        2013-12-31        600      700             √  
B        2013-02-22        200      700             √
B        2012-12-31        600      700 ,           × 
 我需要查的结果集是: 根据NAME 分组,从最大日期开始,只要 (比当前日期大的日期的 SK 总和)SUM(SK) < ALL 就满足,
比如  对于第1条记录 NAME:A, DATE>2010-10-11的 SUM(SK)=0 < ALL符合, 而第4条记录NAME:A, DATE>2010-05-06的 SUM(SK)=700 > ALL 就不满足了。
我目前的SQL语句是:
select NAME, DATE, SK, ALL
from table t1
where exists(select 1 from table t2 and t1.Name=t2.Name and t2.Date>t1.Date having sum(sk)<t1.ALL) or not exists(select 1 from table t2 and t1.Name=t2.Name and t2.Date>t1.Date)

因为表table 有好几万条数据, 这样对每条记录都去计算 日期后的 总和 速度太慢,大概要执行70多秒,求大神该怎么优化?



其实想要的结果集就是 按 Name分组,  SUM(SK)刚刚好大于或等于ALL,并且是日期是从最后开始往前的
------解决方案--------------------
是不是这样的?
select t4.*, t3.sum1
  from t t4,
       (select t1.name, t1.date, nvl(sum(t2.sk), 0) sum1
          from t t1, t t2
         where t1.name = t2.name(+)
           and t1.date < t2.date(+)
         group by t1.name, t1.date) t3
 where t3.name = t4.name
   and t3.date = t4.date
   and t3.sum1 < t4.all