按小时查询优化分组

时间:2017-04-25 01:33:36

标签: sql oracle

请帮助优化我的查询。它看起来太笨重了。 我想有一种更好的方法可以在sql中使用hours(datetime)

填充了一个表dauditnew,人口日期时间存储在auditdate列中。

查询按小时返回行数。

SELECT t.Hour, COUNT(t.Hour) as Count  FROM dauditnew d, 
  (SELECT 0 as Hour  FROM DUAL UNION 
   SELECT 1 FROM DUAL UNION 
   SELECT 2 FROM DUAL UNION 
   SELECT 3 FROM DUAL UNION 
   SELECT 4 FROM DUAL UNION 
   SELECT 5 FROM DUAL UNION 
   SELECT 6 FROM DUAL UNION 
   SELECT 7 FROM DUAL UNION 
   SELECT 8 FROM DUAL UNION 
   SELECT 9 FROM DUAL UNION 
   SELECT 10 FROM DUAL UNION 
   SELECT 11 FROM DUAL UNION 
   SELECT 12 FROM DUAL UNION 
   SELECT 13 FROM DUAL UNION 
   SELECT 14 FROM DUAL UNION 
   SELECT 15 FROM DUAL UNION 
   SELECT 16 FROM DUAL UNION 
   SELECT 17 FROM DUAL UNION 
   SELECT 18 FROM DUAL UNION 
   SELECT 19 FROM DUAL UNION 
   SELECT 20 FROM DUAL UNION 
   SELECT 21 FROM DUAL UNION 
   SELECT 22 FROM DUAL UNION 
   SELECT 23 FROM DUAL) t
where 
  d.auditdate >= TO_DATE('25.04.2017 ' || t.Hour, 'dd.mm.yyyy HH24') and 
  d.auditdate <= TO_DATE('25.04.2017 ' || t.Hour || '_59_59', 'dd.mm.yyyy HH24_MI_SS')
group by t.Hour 

1 个答案:

答案 0 :(得分:1)

你想从这样的事情开始:

select trunc(d.auditdate, 'HH24') as hh, count(*)
from dauditnew d
where d.auditdate >= '2017-04-25' and d.auditdate < '2017-04-26'
group by trunc(d.auditdate, 'HH24')
order by hh;

如果错过了几个小时,那么您可以使用left join作为子查询。