2014-01-10 140 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

聽起來正確。 –

相關問題