Oracle 按小时或按天分组记录,并用零或空值填充空白

Oracle 按小时或按天分组记录,并用零或空值填充空白,oracle,group-by,hour,days,Oracle,Group By,Hour,Days,我编写了一个查询,逐小时统计记录: select TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24'),count(*) from req group by TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24'); 结果是: 2012-02-22 13 2280 2012-02-22 15 1250 2012-02-22 16 1245 2012-02-22 19 1258 但我需要这样的结果: 2

我编写了一个查询,逐小时统计记录:

select TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24'),count(*) from req group by
TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24');
结果是:

2012-02-22 13    2280
2012-02-22 15    1250
2012-02-22 16    1245
2012-02-22 19    1258
但我需要这样的结果:

2012-02-22 13    2280
2012-02-22 14    0
2012-02-22 15    1250
2012-02-22 16    1245
2012-02-22 17    0
2012-02-22 18    0
2012-02-22 19    1258
我也有这些查询,按天和月分组

select TO_CHAR(copied_timestamp, 'YYYY-MM-DD'),count(*)  from req
group by TO_CHAR(copied_timestamp, 'YYYY-MM-DD');

select TO_CHAR(copied_timestamp, 'YYYY-MM'),count(*)  from req
group by TO_CHAR(copied_timestamp, 'YYYY-MM');
我也需要用零或空来填补它们的空白。 非常感谢您的帮助。

试试: 第一次按小时查询:

with t as (
  select mnd + ((level-1)/24) ddd
  from
  (select trunc(min(copied_timestamp),'hh') mnd, trunc(max(copied_timestamp),'hh') mxd from req) v
  connect by mnd + ((level-1)/24) <= mxd
  )
select to_char(trunc(d1, 'hh'), 'yyyy-mm-dd hh24'), count(d2) from 
(select nvl(copied_timestamp, ddd) d1, copied_timestamp d2 from req right outer join (
  select ddd from t) ad on ddd = trunc(copied_timestamp, 'hh'))
group by trunc(d1, 'hh');
按天进行第二次查询:

with t as (
      select mnd + level-1 ddd
      from
      (select trunc(min(copied_timestamp),'dd') mnd, trunc(max(copied_timestamp),'dd') mxd from req) v
      connect by mnd + level-1 <= mxd
      )
    select to_char(trunc(d1, 'dd'), 'yyyy-mm-dd'), count(d2) from 
    (select nvl(copied_timestamp, ddd) d1, copied_timestamp d2 from req right outer join (
      select ddd from t) ad on ddd = trunc(copied_timestamp, 'dd'))
    group by trunc(d1, 'dd');
第三次按月查询:

with t as (
      select add_months(mnd, level-1) ddd
      from
      (select trunc(min(copied_timestamp),'mm') mnd, trunc(max(copied_timestamp),'mm') mxd from req) v
      connect by add_months(mnd, level-1) <= mxd
      )
    select to_char(trunc(d1, 'mm'), 'yyyy-mm'), count(d2) from 
    (select nvl(copied_timestamp, ddd) d1, copied_timestamp d2 from req right outer join (
      select ddd from t) ad on ddd = trunc(copied_timestamp, 'mm'))
    group by trunc(d1, 'mm');

我使用JPA原生查询,所以我认为pl/sql不会有任何问题。有人知道如何在Mysql中处理这种查询吗?谢谢A.B.Cade,它可以工作,但我在第一篇专栏文章中没有看到小时。我只看到日月年!我想这是因为trunc函数。我怎么能用它来显示小时呢?可能是因为sql开发人员没有显示时间?顺便问一下,第二个和第三个查询如何?尝试将truncd1“hh”替换为to_chartruncd1“hh”,“yyy-mm-dd-hh24”。对于其他查询,它们应该是相同的,只需按日期用dd trunc它们,或按月份用mm trunc它们,只需替换hh@A.B.Cade我认为这个查询返回的dd和mm结果是错误的。我不熟悉connect by命令,但我认为我们应该在使用dd或mm时更改数字24。它适用于hh。即使在你的小提琴中,mm和dd的结果也是错误的。使用dd和mm执行部分连接,您将看到每天或每月都有多条记录!这是正确的:从select MINCOPYED_timestamp mnd、MAXCOPYED_timestamp mxd from req v connect by mnd+level/24中选择到\u chartruncmnd+level/24、'hh'、'yyyy-mm-dd hhh24'ddd。当然,level是一个表示写入的整数,如果将其添加到日期类型中,则会增加天数,因此仅在小时内,按24进行设置才有意义。修复方法很简单:对于天,使用mnd+级别;对于月,使用add\ monthsmnd,级别。我想到了另一件事——级别从1开始,所以基本上你需要使用级别1。我还认为最好在内部查询中截断最小/最大日期。所以,这里是新的提琴:。如果它工作正常,那么我将更新我的答案提琴不会永远停留。。。