这是我的表 现在想生成如下这样一个视图:请教高手们帮忙写出这个视图的sql语名,积数的计算可用函数,十分感谢!
解决方案 »
- 5K一个月高薪面试题??
- sql2000语句转换成ORACLE语句,请大家帮忙
- 重新安装oracle9i服务器,要做一些什么操作?谢谢
- oracle中有没有像SQL Server 中的@@error的功能方法
- 对于大数据量的表有什么好的策略可以解决性能问题?
- merge语句在存储过程中无法使用?
- 存储过程中,创建CREATE DATABASE LINK的问题,请高手帮忙,急啊
- network文件夹找不到listener.ora文件,服务里也没有OracleOraHome90TNSListener服务?(马上给分)
- 怎样正确的链接两个字符串?谢谢!100分敬上
- 如何查看一个表的占用多少空间,他的索引占用多少空间啊???
- 两行数据合为一行,请高手帮忙
- 用DBMS的软件包和OCI 开发的区别是什么?
也就是:
select to_date('2008-02-10','yyyy-mm-dd')-to_date('2008-01-01','yyyy-mm-dd') from dual就像下面这张图一样道理一样:我这个地方就是要求积数,那有函数啊。请高手帮忙看一下。
from 表
(SELECT TO_DATE ('2008-01-01', 'yyyy-mm-dd') dt, 100 kc
FROM DUAL
UNION ALL
SELECT TO_DATE ('2008-01-03', 'yyyy-mm-dd') dt, 300 kc
FROM DUAL
UNION ALL
SELECT TO_DATE ('2008-01-10', 'yyyy-mm-dd') dt, 900 kc
FROM DUAL
UNION ALL
SELECT TO_DATE ('2008-01-15', 'yyyy-mm-dd') dt, 1000 kc
FROM DUAL)
SELECT *
FROM a
测试数据集
Row# DT KC1 2008/1/1 100
2 2008/1/3 300
3 2008/1/10 900
4 2008/1/15 1000
按你的要求写的语句SELECT aa.dt 时间, aa.kc 库存, aa.days 天数,
SUM (sum_day) OVER (ORDER BY aa.dt) + aa.kc 积数
FROM (SELECT a.dt, a.kc, a.dt - FIRST_VALUE (dt) OVER (ORDER BY dt)
+ 1 days,
LAG (kc, 1, 0) OVER (ORDER BY dt)
* TRUNC (a.dt - LAG (dt, 1, a.dt - 1) OVER (ORDER BY dt))
sum_day
FROM a) aa结果集Row# 时间 库存 天数 积数1 2008/1/1 100 1 100
2 2008/1/3 300 3 500
3 2008/1/10 900 10 3200
4 2008/1/15 1000 15 7800
WITH a AS
(SELECT TO_DATE ('2008-01-01', 'yyyy-mm-dd') dt, 100 kc
FROM DUAL
UNION ALL
SELECT TO_DATE ('2008-01-03', 'yyyy-mm-dd') dt, 300 kc
FROM DUAL
UNION ALL
SELECT TO_DATE ('2008-01-10', 'yyyy-mm-dd') dt, 900 kc
FROM DUAL
UNION ALL
SELECT TO_DATE ('2008-01-15', 'yyyy-mm-dd') dt, 1000 kc
FROM DUAL)
Row# 日期 库存1 2008/1/1 100
2 2008/1/3 300
3 2008/1/10 900
4 2008/1/15 1000==================================
sql语句
SELECT aa.dt 时间, aa.kc 库存, aa.days 天数,
SUM (sum_day) OVER (ORDER BY aa.dt) + aa.kc 积数
FROM (SELECT a.dt, a.kc, a.dt - FIRST_VALUE (dt) OVER (ORDER BY dt)
+ 1 days,
LAG (kc, 1, 0) OVER (ORDER BY dt)
* TRUNC (a.dt - LAG (dt, 1, a.dt - 1) OVER (ORDER BY dt))
sum_day
FROM a) aa
结果
Row# 时间 库存 天数 积数1 2008/1/1 100 1 100
2 2008/1/3 300 3 500
3 2008/1/10 900 10 3200
4 2008/1/15 1000 15 7800
2008-1-1 100
2008-1-3 300
2008-1-10 300
2008-1-12 200
2008-2-26 100函数
CREATE OR REPLACE FUNCTION f
(
p_num NUMBER
,p_dat DATE
) RETURN NUMBER AS
cumnum NUMBER;
BEGIN
SELECT SUM(val)
INTO cumnum
FROM (SELECT ((dat - trunc(p_dat) + 1) -
lag((dat - trunc(p_dat) + 1), 1, 0) over(ORDER BY dat)) *
lag(num, 1, 0) over(ORDER BY dat) val
,rownum rn
FROM a)
WHERE rn <= p_num;
RETURN cumnum;
END;视图
CREATE OR REPLACE VIEW V AS
SELECT dat
,num
,dat - trunc(SYSDATE,'yyyy') + 1 DAY
,f(ROWNUM,trunc(SYSDATE,'yyyy')) + num cumnum
FROM a结果
select * from vDAT NUM DAY CUMNUM
2008-1-1 100 1 100
2008-1-3 300 3 500
2008-1-10 300 10 2600
2008-1-12 200 12 3100
2008-2-26 100 57 12000已经假定你的数据日期是有顺序的,如果乱序要改一下,先排好序.
f的两个参数第一个是rownum,不用变,第二个是期初第一天.
不知道是不是你要的,不对的话改改也就行了,反正是可实现的.
好几个分析函数里都用到order by 的话,这是很耗时间的操作