+ -
当前位置:首页 → 问答吧 → 求一个分析函数SQL的写法。谢谢。

求一个分析函数SQL的写法。谢谢。

时间:2011-09-02

来源:互联网

代码如下:
WITH TB_TIME AS
(SELECT TO_NUMBER(TO_CHAR(TO_DATE(LPAD(93000, 6, '0'), 'HH24MISS') +
                           (ROWNUM - 1) / 24 / 60 / 60,
                           'HH24MISS')) AS DATE_TIME
    FROM DUAL
  CONNECT BY ROWNUM <= 20),
TB_DB AS
(SELECT 93001 AS OCC_TIME, 100 AS MONEY
    FROM DUAL
  UNION ALL
  SELECT 93010 AS OCC_TIME, 200 AS MONEY
    FROM DUAL
  UNION ALL
  SELECT 93017 AS OCC_TIME, -200 AS MONEY
    FROM DUAL
  UNION ALL
  SELECT 93005 AS OCC_TIME, 300 AS MONEY
    FROM DUAL
  UNION ALL
  SELECT 93008 AS OCC_TIME, -100 AS MONEY FROM DUAL)
SELECT T1.DATE_TIME, T2.MONEY
  FROM TB_TIME T1, TB_DB T2
WHERE T1.DATE_TIME = T2.OCC_TIME(+)
ORDER BY T1.DATE_TIME

结果是:
                time         MONEY
1        93000       
2        93001        100
3        93002       
4        93003       
5        93004       
6        93005        300
7        93006       
8        93007       
9        93008        -100
10        93009       
11        93010        200
12        93011       
13        93012       
14        93013       
15        93014       
16        93015       
17        93016       
18        93017        -200
19        93018       
20        93019       

要求是得到如下结果:
                time         MONEY
1        93000                0
2        93001        100        100
3        93002                100
4        93003                100
5        93004                100
6        93005        300        300
7        93006                300
8        93007                300
9        93008        -100        -100
10        93009                -100
11        93010        200        200
12        93011                200
13        93012                200
14        93013                200
15        93014                200
16        93015                200
17        93016                200
18        93017        -200        -200
19        93018                -200
20        93019                -200

写了个分析函数:
SELECT T1.DATE_TIME,
       T2.MONEY,
       NVL(T2.MONEY,
           (SELECT NVL(MAX(T11.MONEY)
                       KEEP(DENSE_RANK LAST ORDER BY T11.OCC_TIME),
                       0)
              FROM TB_DB T11
             WHERE T11.OCC_TIME <= T1.DATE_TIME))
  FROM TB_TIME T1, TB_DB T2
WHERE T1.DATE_TIME = T2.OCC_TIME(+)
ORDER BY T1.DATE_TIME
希望能够有更高效更好的分析函数参考。先谢咯~

作者: linsens   发布时间: 2011-09-02

http://www.itpub.net/viewthread.php?tid=1332059&highlight=

作者: dingjun123   发布时间: 2011-09-02