我在桌子上工作
Date name value
20110201 xxx 1.2
...
20110201 yyy 1.3
我想仅计算2011年7月份每个名字的平均价值。这是我的代码。
select a.name, avg(value)
over (partition by name Range between 31
preceding and XXX) average
From table a
XXX是哪一行' 20110731'为每个名字。如何完成XXX部分?
PS:因为7月份有31天,所以从7月31日到平均31天的解析功能应该有效。答案 0 :(得分:1)
可能你可以使用子查询吗?
select a.name, (select avg(value) from table where name=a.name and trunc(date,'mm')='01-jul-2011') average
From table a;
答案 1 :(得分:1)
我认为您不需要分析功能来执行此操作。您可以简单地执行以下操作:
SELECT a.name, AVG(a.value)
FROM mytable a
WHERE a.mydate LIKE '201107__' -- I'm assuming you're storing the date as a VARCHAR2
GROUP BY a.name;
(作为附注,将日期存储为字符列是不好的做法。)
请注意我在_
运算符的主题中使用的通配符LIKE
。它匹配单个字符。
另一种方法可能如下:
SELECT a.name, AVG(a.value)
FROM mytable a
WHERE TO_DATE(a.mydate, 'YYYYMMDD') BETWEEN DATE'2011-07-01' AND DATE'2011-07-31'
GROUP BY a.name;
即,将日期转换为DATE
并进行适当处理。我已在上面使用过BETWEEN
,即使我已在其他地方推荐过它,因为这些日期不会有时间部分需要关注。