问题1:
有这样的表 MyRecord:
monthid ——月份
income —— 收入
out——支出
monthid  income   out  
2006-1    1000    200
2006-2    2000    500
2006-3    200     1000
……要求根据这个表创建一个视图 MyRecordView:
save——节余
monthid   save
2006-1    800
2006-2    2300
2006-3    1500
……问题2:
有这样一个表RecordA:
recordid    starttime          endtime            status
1           2007-5-1 10:01     2007-5-1 17:00     close
2           2007-5-1 17:01     2007-5-2 00:00     close
3           2007-5-2 00:01     2007-5-2 10:00     close
4           2007-5-2 10:01     2007-5-2 17:00     open
5           2007-5-2 17:01     2007-5-3 00:00     open
6           2007-5-3 00:01     2007-5-3 10:00     close
7           2007-5-3 10:01     2007-5-3 17:00     close
8           2007-5-3 17:01     2007-5-4 00:00     open
……
要求根据这张表在生成一个视图RecordA_View
recordid    starttime          endtime          last      status
1           2007-5-1 10:01     2007-5-2 10:00   24h0m0s   close
2           2007-5-3 00:01     2007-5-3 17:00   17h0m0s   close
……请问oracle如何用存储过程或者sql语句实现?请教各位高人指点,感激不尽!

解决方案 »

  1.   

    问题1:
    CREATE VIEW MyRecordView AS
           SELECT monthid, (income - out) AS save
           FROM   MyRecord
    /
      

  2.   

    问题2:
    5/2不也有一笔为close吗?为什么不算进去呢?业务规则是什么?
      

  3.   

    问题1:save不是income-out就能得到的,计算每月的节余要考虑到上个月的节余。
    问题2:表中记录的是定时取得的设备状态,现在关心的是设备“close”状态,要将设备每次“close”状态(可能包含几个时间段,如果是几个连续的时间段,就将几个连续时间段整理成一条记录)整理成一条记录然后生成一个视图。
    请教各位高手!谢谢了!
      

  4.   

    哦,问题一看错了,应如下:CREATE VIEW MyRecordView AS
        SELECT MONTHID, SUM(INCOME - OUT) OVER (ORDER BY MONTHID)
        FROM   MyRecord;
      

  5.   

    问题二:SELECT ROWNUM, STARTTIME, ENDTIME, STATUS
    FROM (
    SELECT  A.STARTTIME, LEAD(ENDTIME, 1, NULL) OVER (ORDER BY STARTTIME) AS ENDTIME, A.STATUS, PREVFLAG
    FROM  (
    SELECT A.RECORDID, A.STARTTIME, A.ENDTIME, A.STATUS,
                   ABS(NVL(LAG(ENDTIME, 1, NULL) OVER (ORDER BY STARTTIME) + 1/1440 - STARTTIME, -1)) AS PREVFLAG,
                   ABS(NVL(LEAD(STARTTIME, 1, NULL) OVER (ORDER BY STARTTIME) - 1/1440 - ENDTIME, -1)) AS NEXTFLAG               
    FROM   RECORDA A
    WHERE  STATUS = 'close'
          ) A
    WHERE PREVFLAG + NEXTFLAG > 0
         )
    WHERE PREVFLAG > 0
      

  6.   

    至于那个 last 自已可找找相关资料,随手写的,就没想那么多