2015-02-11 80 views
0

我试图获得每小时创建的记录数,但遇到了将结果正确分组的问题。这个想法类似于:How to count number of records per day?Oracle每小时记录一次记录数

但是,我正在使用的字段是一个日期时间字段,记录到第二个。这似乎是造成Group By语句的麻烦,因为查询返回时,在指定时间段内每秒有一行,这是太多的数据,并且会使我想要对结果做的工作更多比它需要的更困难(如果没有其他原因,它的行数太多,无法放在一张Excel表格中)。

我当前的代码是:

SELECT ASD, Count(ASD) Num_CR 
From DB_Name.Table_Name fcr 
Where trunc(fcr.ASD) > to_Char('31-DEC-2014') 
    And trunc(fcr.ASD) < to_Char('31-JAN-2015') 
    And fcr.Status_Code = 'C' 
Group By ASD 
Order By ASD; 

我试图改变分组依据是TRUNC(ASD),但导致蟾蜍引发此错误:ORA-00979:不是GROUP BY表达式。

在此先感谢!

+1

当你添加trunc()进行分组..你必须在'select'和'order by'中做同样的事情..通过逻辑,你可以选择和订购只,你分组.. – 2015-02-11 15:04:19

回答

2

当您使用在selectorder by条款汇聚东西必须匹配什么在group by clause

SELECT trunc(ASD,'hh'), Count(ASD) Num_CR 
From DB_Name.Table_Name fcr 
Where trunc(fcr.ASD) > to_date('31-DEC-2014') 
    And trunc(fcr.ASD) < to_date('31-JAN-2015') 
    And fcr.Status_Code = 'C' 
Group By trunc(ASD,'hh') 
Order By trunc(ASD,'hh'); 

当应用于日期, trunc将截断到一天。要截断到不同的级别,请指定要截断的元素的格式作为第二个参数(例如,'hh'将截断为小时; 'mm'将截断为月份)。

+0

像魅力一样工作。如果没有在trunc语句中指定'hh',那么猜测就是这个问题。 – JMichael 2015-02-11 15:36:09

+0

岩石就像一颗子弹。 – user2244734 2017-07-03 16:37:01

1
SELECT to_char(ASD,'DD-MM-YYYY HH'), Count(ASD) Num_CR 
From DB_Name.Table_Name fcr 
Where trunc(fcr.ASD) > to_Char('31-DEC-2014') 
    And trunc(fcr.ASD) < to_Char('31-JAN-2015') 
    And fcr.Status_Code = 'C' 
Group By to_char(ASD,'DD-MM-YYYY HH') 
Order By to_char(ASD,'DD-MM-YYYY HH'); 

快速和肮脏:)

+0

这种解决方案将按天排序第一,所以2月1日将在1月1日和1月2日之间。通常最好留在日期日期数据类型,直到格式化实际上是必要的(即用于显示)。 – Allan 2015-02-11 15:26:38

1

首先,你为什么要在已经是字符串的东西上做to_char?其次,你为什么试图将(大概)DATE列与字符串进行比较?这会带来疯狂......

我觉得你像后是:

SELECT trunc(ASD, 'hh') asd_hr, Count(ASD) Num_CR 
From  DB_Name.Table_Name fcr 
Where trunc(fcr.ASD) > to_date('31/12/2014', 'dd/mm/yyyy') 
And  trunc(fcr.ASD) < to_date('31/01/2015', 'dd/mm/yyyy') 
And  fcr.Status_Code = 'C' 
Group By trunc(ASD, 'hh') 
Order By trunc(ASD, 'hh'); 

另外值得注意的,你的意思是,从你的查询中排除一月的最后一天?如果是这样,那么很好,但如果没有,那么也许你应该改变它to_date('01/02/2015', 'dd/mm/yyyy')