求已一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