在oracle里这种求平均应该如何写?

seal031 2017-06-14 04:54:17
表如下:
DATE ACTYPE DICT
2017-01-01 A319 2
2017-01-01 A320 2
2017-01-02 A319 5
2017-01-02 A320 3
2017-01-03 A319 1
2017-01-03 A320 6
2017-01-04 A319 3
2017-01-04 A320 9
想得到:
DATE ACTYPE DICT DICT_MOV
2017-01-03 A319 1 2.666666
2017-01-03 A320 6 3.666666
2017-01-04 A319 3 3
2017-01-04 A320 9 6
手敲的,所以只写了2天的结果。。
DICT_MOV的值是同一个ACTYPE下近3天的均值,如3.666666是ACTYP为A320、2017-01-01至2017-01-03的均值,(2+3+6)/3。
请问这个sql应该如何写呢,谢谢!
...全文
206 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
seal031 2017-06-15
  • 打赏
  • 举报
回复
谢谢各位,最后找到的解决方案是这样: DATES字段是varchar2时:
SELECT DATES, actype, dict,
       AVG( dict ) OVER (
         PARTITION BY actype
         ORDER BY TO_DATE(DATES,'yyyy-mm-dd')
         RANGE BETWEEN INTERVAL '2' DAY PRECEDING
               AND     INTERVAL '0' DAY FOLLOWING
       ) AS dict_mov
FROM   MOV_TEST
ORDER BY DATES, actype;
DATES字段为date时:
SELECT DATES, actype, dict,
       AVG( dict ) OVER (
         PARTITION BY actype
         ORDER BY DATES
         RANGE BETWEEN INTERVAL '3' DAY PRECEDING
               AND     INTERVAL '0' DAY FOLLOWING
       ) AS dict_mov
FROM   MOV_TEST
ORDER BY DATES, actype;
稍后结贴散分
卜塔 2017-06-15
  • 打赏
  • 举报
回复
SELECT ID,actype,dict1,ROUND((dict1+dict2+dict3)/3 , 6)DICT_MOV FROM (SELECT ID,actype, dict dict1, LAG(dict,1) OVER (PARTITION BY actype ORDER BY ID,actype) dict2, LAG(dict,2) OVER (PARTITION BY actype ORDER BY ID,actype) dict3 FROM TEST) WHERE dict2 IS NOT NULL AND dict3 IS NOT NULL ORDER BY ID,actype;
chengccy 2017-06-15
  • 打赏
  • 举报
回复
WITH T AS (SELECT DATE '2017-01-01' AS T_DATE, 'A319' ACTYPE, 2 AS DICT FROM DUAL UNION ALL SELECT DATE '2017-01-01', 'A320', 2 FROM DUAL UNION ALL SELECT DATE '2017-01-02', 'A319', 5 FROM DUAL UNION ALL SELECT DATE '2017-01-02', 'A320', 3 FROM DUAL UNION ALL SELECT DATE '2017-01-03', 'A319', 1 FROM DUAL UNION ALL SELECT DATE '2017-01-03', 'A320', 6 FROM DUAL UNION ALL SELECT DATE '2017-01-04', 'A319', 3 FROM DUAL UNION ALL SELECT DATE '2017-01-04', 'A320', 9 FROM DUAL) SELECT T.*, AVG(DICT) OVER(PARTITION BY ACTYPE ORDER BY T_DATE RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) AVG_DICT FROM T
卜塔 2017-06-15
  • 打赏
  • 举报
回复
多谢楼主。 另:为什么DATES字段是varchar2时:prededing是2,following是0; 而dates字段是date类型时:preceding是3,following是0呢?
小当家e 2017-06-14
  • 打赏
  • 举报
回复
select DATE,ACTYPE,DICT,(sum(DICT) over(partition by grouptype))/3 DICT_MOV from ( select DATE,ACTYPE,DICT, trunc((date-date'2017-01-01')/3) grouptype from 表 ) 老是敲多字。。
小当家e 2017-06-14
  • 打赏
  • 举报
回复
select DATE,ACTYPE,DICT,(sum(DICT) over(partition by grouptype))/3 DICT_MOV from ( select DATE,ACTYPE,DICT,group by trunc((date-date'2017-01-01')/3) grouptype from 表 )
小当家e 2017-06-14
  • 打赏
  • 举报
回复
select DATE,ACTYPE,DICT,sum(DICT)/3 over(partition by grouptype) DICT_MOV from ( select DATE,ACTYPE,DICT,group by trunc((date-date'2017-01-01')/3) grouptype from 表 )
sxq129601 2017-06-14
  • 打赏
  • 举报
回复
select dates, actype, dict, (dict + dict2 + dict3) / 3 DICT_MOV from (SELECT dates, actype, dict, lag(dict, 1) over(partition by actype order by dates, actype) dict2, lag(dict, 2) over(partition by actype order by dates, actype) dict3 FROM TEST) where dict2 is not null and dict3 is not null
  数据库操作是软件行业人员必备的技能,这门视频教学课程主要是针对从事软件技术的新人的,适合在校大学生、准备转行到IT行业的新人、软件公司新入职员工。这门课程主要涉及Oracle数据库的基础操作和SQL语法,因为绝大部分软件技术人员掌握这些就可以了,数据库的大部分功能,我们平时是用不到的,所以不用花太多时间去研究。把这门课程面的内容学会,足以胜任日常性数据库相关的工作。  这门视频教学课程不是针对DBA的培训课程,从事DBA工作的人在软件行业人员的占比不高,就业面不太广,有做DBA志向的同学可以到专门的培训机构学习Oracle的OCA、OCP、OCM课程,他们有针对应试的培训内容,他们也可以安排相应的考试,考试通过后会有相应的证书,这门课程更偏向编程应用,不是面向Oracle认证考试的。   我对Oracle数据库有十几年的使用经验,我们公司的数据库是Oracle数据库,基本上每天的编程工作都要SQL语句,公司的历史数据比较多,需要通过编SQL语句来进行查询处理,有两年时间,我的工作就是编Oracle数据库的存储过程。  这个视频教学课程使用Oracle 19c版本的数据库进行讲解。每节课程都结合工作实际,都是干货,都经过认真准备,相信可以给大家带来很大帮助。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧