【oracle】查询表中每天的余额,如果当天没有就返回之前最近的一天的余额

场景:
a 表每天抽取并计算话费余额(只抽取正常开机的),一个号码每天一条记录,记录该号码每天的余额。
如果一个号码123在9.12号申请停机了,于是a表便不再有123号码9.12号之后的记录。
此时查询123号码9.13时之后的余额应该还是9.12的余额。
问题:
求大神给个脚本(只要能查出来就行,function,procedure,sql都行)查询9.10-9.15号123的余额能返回如下结果:
a表字段 id,number,time,balance
id time balance
6 2012.9.15 98.2
5 2012.9.14 98.2
4 2012.9.13 98.2
3 2012.9.12 98.2
2 2012.9.11 102.8
1 2012.8.10 110.5

第1个回答  2012-11-15
很简单,我只是给你举个例子,剩下的你自己完成,下面的语句只可以直接执行。
with v_tmp as -- 建一个临时视图
(select '2012.11.11' date1, 111.2 balance
from dual
union all
select '2012.11.12' date1, 91.2 balance from dual order by date1)
select to_char(b.date1, 'yyyy.mm.dd'), NVL(a.balance, b.balance)
from v_tmp a,
(select to_date('2012.11.11', 'yyyy.mm.dd') + rownum - 1 date1, -- 生成日期列
(select distinct last_value(c.balance) over() from v_tmp c) balance -- 取最后一个值
from dual
start with rownum = 1
connect by rownum < 15) b
where a.date1(+) = to_char(b.date1, 'yyyy.mm.dd')
order by 1;
第2个回答  2012-11-15
你的time是date类型吗?
如果不是 自己想办法用to_date转一下 我给你提供的SQL 只有在你time类型为date有效
SELECT * FROM(SELECT ROW_NUMBER() OVER(PARTITION BY id ORDER TIME DESC) RN, ID, BALANCE
FROM A) T
WHERE T.RN = 1;
好了 给分!还有问题加我QQ :772642286
第3个回答  2012-11-15
select id,time,nvl(balance,lag(avg(balance),1)over(paratition by balance)) from tab;
第4个回答  2012-11-15
什么啊?
第5个回答  2012-11-15
你的表结构是啥样的也不说,叫人怎么查追问

a表 字段 id,number,time,balance