Oracle数据库按时间进行分组统计数据的方法
Oracle按不同时间分组统计的sql
如下表table1:
日期(exportDate)数量(amount) ------------------------- 14-2月-0820 10-3月-082 14-4月-086 14-6月-0875 24-10月-0923 14-11月-0945 04-8月-105 04-9月-1044 04-10月-1088
注意:为了显示更直观,如下查询已皆按相应分组排序
1.按年份分组
selectto_char(exportDate,'yyyy'),sum(amount)fromtable1groupbyto_char(exportDate,'yyyy');
年份数量 ----------------------------- 200968 2010137 2008103
2.按月份分组
selectto_char(exportDate,'yyyy-mm'),sum(amount)fromtable1groupbyto_char(exportDate,'yyyy-mm') orderbyto_char(exportDate,'yyyy-mm');
月份数量 ----------------------------- 2008-0220 2008-032 2008-046 2008-0675 2009-1023 2009-1145 2010-085 2010-0944 2010-1088
3.按季度分组
selectto_char(exportDate,'yyyy-Q'),sum(amount)fromtable1groupbyto_char(exportDate,'yyyy-Q') orderbyto_char(exportDate,'yyyy-Q');
季度数量 ------------------------------ 2008-122 2008-281 2009-468 2010-349 2010-488
4.按周分组
selectto_char(exportDate,'yyyy-IW'),sum(amount)fromtable1groupbyto_char(exportDate,'yyyy-IW') orderbyto_char(exportDate,'yyyy-IW');
周数量 ------------------------------ 2008-0720 2008-112 2008-166 2008-2475 2009-4323 2009-4645 2010-315 2010-3544 2010-4088
PS:Oracle按时间段分组统计
想要按时间段分组查询,首先要了解level,connectby,oracle时间的加减.
关于level这里不多说,我只写出一个查询语句:
----level是一个伪例 selectlevelfromdualconnectbylevel<=10 ---结果: 1 2 3 4 5 6 7 8 9 10
oracle时间的加减看看试一下以下sql语句就会知道:
selectsysdate-1fromdual ----结果减一天,也就24小时 selectsysdate-(1/2)fromdual -----结果减去半天,也就12小时 selectsysdate-(1/24)fromdual -----结果减去1小时 selectsysdate-((1/24)/12)fromdual ----结果减去5分钟 selectsydate-(level-1)fromdualconnectbylevel<=10 ---结果是10间隔1天的时间
下面是本次例子:
selectdt,count(satisfy_degree)asnumfromT_DEMOi, (selectsysdate-(level-1)*2dt fromdualconnectbylevel<=10)d wherei.satisfy_degree='satisfy_1'and i.insert_time<dtandi.insert_time>d.dt-2 groupbyd.dt
例子中的sysdate-(level-1)*2得到的是一个间隔是2天的时间
groupbyd.dt 也就是两天的时间间隔分组查询
自己实现例子:
createtableA_HY_LOCATE1 ( MOBILE_NOVARCHAR2(32), LOCATE_TYPENUMBER(4), AREA_NOVARCHAR2(32), CREATED_TIMEDATE, AREA_NAMEVARCHAR2(512), );
select(sysdate-13)-(level-1)/4fromdualconnectbylevel<=34 --从第一条时间记录开始(sysdate-13)为表中的最早的日期,“34”出现的分组数(一天按每六个小时分组就应该为4)
一下是按照每6个小时分组
selectmobile_no,area_name,max(created_time),dt,count(*)asnumfroma_hy_locate1i, (select(sysdate-13)-(level-1)/4dt fromdualconnectbylevel<=34)d wherei.locate_type=1and i.created_time<dtandi.created_time>d.dt-1/4 groupbymobile_no,area_name,d.dt
另外一个方法:
--按六小时分组 selecttrunc(to_number(to_char(created_time,'hh24'))/6),count(*) fromt_test wherecreated_time>trunc(sysdate-40) groupbytrunc(to_number(to_char(created_time,'hh24'))/6) --按12小时分组 selecttrunc(to_number(to_char(created_time,'hh24'))/6),count(*) fromt_test wherecreated_time>trunc(sysdate-40) groupbytrunc(to_number(to_char(created_time,'hh24'))/6)