Oracle Count 每小时的记录数
Oracle Count number of records each hour
我正在尝试获取每小时创建的记录数,但 运行 无法正确分组结果。这个想法类似于:How to count number of records per day?
但是,我用来分组的字段是一个日期时间字段,可以记录到秒。这似乎导致了 Group By 语句的问题,因为当查询 returns 时,在指定的时间段内每秒有一行,这是太多的数据并且会做我想做的工作结果比需要的更难(如果没有其他原因,它的行太多而不能放在一个 Excel sheet)。
我当前的代码是:
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),但这会导致 Toad 抛出此错误:ORA-00979:不是分组依据表达式。
提前致谢!
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');
又快又脏:)
当您使用聚合时,select
和 order 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'
将截断到月)。
首先,为什么要对已经是字符串的内容执行 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')
我正在尝试获取每小时创建的记录数,但 运行 无法正确分组结果。这个想法类似于:How to count number of records per day?
但是,我用来分组的字段是一个日期时间字段,可以记录到秒。这似乎导致了 Group By 语句的问题,因为当查询 returns 时,在指定的时间段内每秒有一行,这是太多的数据并且会做我想做的工作结果比需要的更难(如果没有其他原因,它的行太多而不能放在一个 Excel sheet)。
我当前的代码是:
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),但这会导致 Toad 抛出此错误:ORA-00979:不是分组依据表达式。
提前致谢!
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');
又快又脏:)
当您使用聚合时,select
和 order 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'
将截断到月)。
首先,为什么要对已经是字符串的内容执行 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')