选择月份; Oracle中特定范围之间的年份

时间:2014-01-10 20:30:59

标签: sql oracle

我的表中有一个名为Notenum的列,每次插入时都会增加1。它在过去几年中有大约200万条记录。

我想知道一段时间内notenum列增加了多少(基本上是平均值)。我不一定需要从查询中返回平均值。我很好,只需要一个数字,然后逐年或逐月地绘制出来。

假设我想知道它在过去6个月,2年内增加了多少......

这是我试图运行的查询,但是我收到以下错误:ORA-00933:Sql命令未正确结束。这是PL / SQL

SELECT TO_CHAR(systemts, 'mm') Month, TO_CHAR(systemts, 'yyyy') YEAR, notenum
FROM nsa_fl.polnote
WHERE systemts
    BETWEEN to_date('01/01/2013', 'mm-dd-yyyy')
    AND to_date('01/01/2014', 'mm-dd-yyyy')
GROUP BY TO_CHAR(systemts, 'mm') Month, TO_CHAR(systemts, 'yyyy') YEAR, notenum

我通读了这个How to group by each day in PL/SQL?,但我只能达到这个目的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为您想要的值是每个时间段内最小值和最大值notenum之间的差异:

SELECT TO_CHAR(systemts, 'yyyy-mm') as yyyymm,
       max(notenum) - min(notenum) + 1 as notenum_range
FROM nsa_fl.polnote
WHERE systemts >= to_date('2013-01-01', 'yyyy-mm-dd') AND
      systemts < to_date('2014-01-01', 'yyyy-mm-dd')
GROUP BY TO_CHAR(systemts, 'yyyy-mm');

我还做了以下更改:

  • 我将年份和月份合并为一列。
  • 我将between更改为两个比较。这可确保您不会从2014-01-01获得任何数据。
  • 我将日期格式修改为yyyy-mm-dd。使用ISO标准格式(在我看来)是一个好习惯。
  • 我从notenum条款中删除了无关的group by

答案 1 :(得分:0)

您的查询有两个问题。首先,你有一个group by子句,没有像sum()或count()这样的聚合。导致错误消息的是group by子句具有别名。