选择具有between和previous子句的特定行

时间:2015-02-26 18:44:45

标签: sql oracle oracle11g

我在桌子上工作

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天的解析功能应该有效。

2 个答案:

答案 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,即使我已在其他地方推荐过它,因为这些日期不会有时间部分需要关注。