求一个分析函数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
希望能够有更高效更好的分析函数参考。先谢咯~
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28