2014-01-10 120 views
0

我的表格中有一个名为Notenum的列,每个新插入都会增加1。它在过去几年有大约200万条记录。在Oracle中的特定范围内选择月份和年份

我想知道在一段时间内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?阅读,但我只得到尽可能这一点。

感谢您的帮助。

回答

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标准格式(我认为)是一个好习惯。
  • 我从group by子句中删除了多余的notenum
+0

戈登,我认为这是我正在寻找的东西,但我得到这个错误:“从关键字不在预期的地方”。 –

+0

列别名是'yyyy-mm'而不是'yyyymm'。 –

+0

嗨,戈登,我有一个疑问,如果缺少一些notenum(s),它会给出正确的结果吗?例如,2014年1月份,最大记录数是1000,最小记录数是900,而删除记录数981到990的记录被删除 - 在这个记录中,2014年1月有90个记录,但你查询的结果是100 。纠正我,如果我错了。 – San

0

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

+0

因此,由于我试图“计数”给定时间的notenums数量,是否需要将其添加到select? –

+0

听起来正确。 –

相关问题