【问题标题】:Oracle Count number of records each hour [duplicate]Oracle Count 每小时记录数[重复]
【发布时间】:2015-02-11 15:01:41
【问题描述】:

我正在尝试获取每小时创建的记录数,但在将结果正确分组时遇到了麻烦。这个想法类似于:How to count number of records per day?

但是,我用于分组依据的字段是一个日期时间字段,它记录到秒。这似乎给 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;

我尝试将 Group By 更改为 trunc(ASD),但这会导致 Toad 抛出此错误:ORA-00979: not a GROUP BY expression。

提前致谢!

【问题讨论】:

  • 当您将trunc() 添加到分组中时.. 您也必须在selectorder by 中执行相同操作.. 按照逻辑,您只能选择和订购,您可以选择什么分组..

标签: sql oracle group-by


【解决方案1】:

当您使用聚合时,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' 将截断为月份)。

【讨论】:

  • 工作就像一个魅力。没有在 trunc 语句中指定“hh”,猜猜这是问题所在。
  • 像子弹一样摇滚。
【解决方案2】:
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');

又快又脏 :)

【讨论】:

  • 此解决方案将首先按天排序,因此 2 月 1 日将介于 1 月 1 日和 1 月 2 日之间。通常最好将日期保留在 date 数据类型中,直到实际需要格式化(即显示)。
【解决方案3】:

首先,你为什么要对已经是字符串的东西做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');

另外值得注意的是,您的意思是从查询中排除 1 月的最后一天吗?如果是这样,那很好,但如果不是,那么也许您应该将其更改为to_date('01/02/2015', 'dd/mm/yyyy')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多