Oracle数据库按时间进行分组统计数据的方法

Oracle按不同时间分组统计的sql
如下表table1:

日期(exportDate)        数量(amount)
--------------          -----------
14-2月 -08            20
10-3月 -08            2
14-4月 -08            6
14-6月 -08            75
24-10月-09           23
14-11月-09           45
04-8月 -10            5
04-9月 -10            44
04-10月-10           88

注意:为了显示更直观,如下查询已皆按相应分组排序

1.按年份分组

select to_char(exportDate,'yyyy'),sum(amount) from table1 group by to_char(exportDate,'yyyy');
年份   数量
-----------------------------
2009  68
2010  137
2008  103

2.按月份分组

select to_char(exportDate,'yyyy-mm'),sum(amount) from table1 group by to_char(exportDate,'yyyy-mm')
order by to_char(exportDate,'yyyy-mm');
月份      数量
-----------------------------
2008-02  20
2008-03  2
2008-04  6
2008-06  75
2009-10  23
2009-11  45
2010-08  5
2010-09  44
2010-10  88

3.按季度分组

select to_char(exportDate,'yyyy-Q'),sum(amount) from table1 group by to_char(exportDate,'yyyy-Q')
order by to_char(exportDate,'yyyy-Q');
季度     数量
------------------------------
2008-1  22
2008-2  81
2009-4  68
2010-3  49
2010-4  88

4.按周分组

select to_char(exportDate,'yyyy-IW'),sum(amount) from table1 group by to_char(exportDate,'yyyy-IW')
order by to_char(exportDate,'yyyy-IW');
周       数量
------------------------------
2008-07  20
2008-11  2
2008-16  6
2008-24  75
2009-43  23
2009-46  45
2010-31  5
2010-35  44
2010-40  88

PS:Oracle按时间段分组统计
想要按时间段分组查询,首先要了解level,connect by,oracle时间的加减.
关于level这里不多说,我只写出一个查询语句:

----level 是一个伪例
 select level from dual connect by level <=10
 ---结果:
1
2
3
4
5
6
7
8
9
10

oracle时间的加减看看试一下以下sql语句就会知道:

select sysdate -1 from dual
----结果减一天,也就24小时
select sysdate-(1/2) from dual
-----结果减去半天,也就12小时
select sysdate-(1/24) from dual
-----结果减去1 小时
select sysdate-((1/24)/12) from dual
----结果减去5分钟
select sydate-(level-1) from dual connect by level<=10
---结果是10间隔1天的时间

下面是本次例子:

select dt, count(satisfy_degree) as num from T_DEMO i ,
(select sysdate - (level-1) * 2 dt
from dual connect by level <= 10) d
where i.satisfy_degree='satisfy_1' and
i.insert_time<dt and i.insert_time> d.dt-2
group by d.dt

例子中的sysdate - (level-1) * 2得到的是一个间隔是2天的时间
group by d.dt  也就是两天的时间间隔分组查询

自己实现例子:

create table A_HY_LOCATE1
(
 MOBILE_NO     VARCHAR2(32),
 LOCATE_TYPE    NUMBER(4),
 AREA_NO      VARCHAR2(32),
 CREATED_TIME    DATE,
 AREA_NAME     VARCHAR2(512),
);

select (sysdate-13)-(level-1)/4 from dual connect by level<=34  --从第一条时间记录开始(sysdate-13)为表中的最早的日期,“34”出现的分组数(一天按每六个小时分组 就应该为4)

一下是按照每6个小时分组

select mobile_no,area_name,max(created_time ),dt, count(*) as num from a_hy_locate1 i ,
(select (sysdate-13)-(level-1)/4 dt
from dual connect by level <= 34) d
where i.locate_type = 1 and
i.created_time<dt and i.created_time> d.dt-1/4
group by mobile_no,area_name,d.dt

另外一个方法:

--按六小时分组
select trunc(to_number(to_char(created_time, 'hh24')) / 6),count(*)
 from t_test
 where created_time > trunc(sysdate - 40)
 group by trunc(to_number(to_char(created_time, 'hh24')) / 6)

--按12小时分组
select trunc(to_number(to_char(created_time, 'hh24')) / 6),count(*)
 from t_test
 where created_time > trunc(sysdate - 40)
 group by trunc(to_number(to_char(created_time, 'hh24')) / 6)
(0)

相关推荐

  • ORACLE多条件统计查询的简单方法

    前几天要做一个统计查询的功能,因为涉及多张表,多种条件的统计分析.一开始便想到了UNION和IF语句,然后写了1000多行代码,就为了查30条数据觉得不应该. 然后就开始百度,多种条件下的统计.然后有一种语法让我眼前一亮,case when then else end 当满足CASE设定的条件时,就可以执行then语句.由于我要做的分组查询统计,是要罗列每一种情况,而且根据输入的"管理员编号"不同返回不同结果,结果记录的条数和每一种情况是可知的,这个语法完全可用 核心代码如下: SEL

  • oracle数据库下统计专营店的男女数量的语句

    Web_THBC 为表示层也就是页面(.aspx) BLL_THBC 为业务逻辑层 DAL_THBC 为数据库交互层 (向数据库执行SQL语句) Model_THBC 为实体类 DbHelper 为数据库连接类 统计个专营店的男女数量 复制代码 代码如下: select dua.UARTERS_ID,dua.UARTERS_NAME ,sum(case when sex = '1' then 1 else 0 end) as Man ,sum(case when sex = '0' then 1

  • Oracle Translate 统计字符出现的次数示例代码

    特殊用法:统计字符串中 E 出现的次数: SELECT LENGTHB(TRANSLATE('ABCDEFGEFGDBE','E'||'ABCDEFGEFGDBE','E')) FROM DUAL; 等同于: SELECT LENGTHB('ABCDEFGEFGDBE')-LENGTHB(REPLACE('ABCDEFGEFGDBE','E','')) FROM DUAL; Translate 的用法 一.语法: TRANSLATE(string,from_str,to_str) 二.目的 返回

  • oracle查看执行最慢与查询次数最多的sql语句

    前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频繁的SQL,往往容易遭遇一些并发性的问题. 那么如何查看ORACLE数据库某个SQL的执行频率/次数呢? 下面来看看完整的示例代码. 一.查询执行最慢的sql select * from (select sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS "执行次

  • 关于oracle中clob字段查询慢的问题及解决方法

    最近在用oracle的过程中用到了对blob字段模糊查询的问题,对oracle来说,我并不是高手,找了很多的资料终于能够查出来了. blob字段直接用 select * from table_name where column like '%%'查找的时候是不能实现的 ,主要是字段类型不符,就想到了 字段转换成varchar2类型,然后再进行查询 select * from table_name where utl_raw.cast_to_varchar2(column) like '%orac

  • Oracle查询表里的重复数据方法

    一.背景 一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录. 二.解决 select id from group by id having count(*) > 1 按照id分组并计数,某个id号那一组的数量超过1条则认为重复. 如何查询重复的数据 select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1 PS:将上面的>号改为=号就可以查询出没有重复的数据了

  • Oracle数据库按时间进行分组统计数据的方法

    Oracle按不同时间分组统计的sql 如下表table1: 日期(exportDate) 数量(amount) -------------- ----------- 14-2月 -08 20 10-3月 -08 2 14-4月 -08 6 14-6月 -08 75 24-10月-09 23 14-11月-09 45 04-8月 -10 5 04-9月 -10 44 04-10月-10 88 注意:为了显示更直观,如下查询已皆按相应分组排序 1.按年份分组 select to_char(expo

  • PHP实现数据库统计时间戳按天分组输出数据的方法

    本文实例讲述了PHP实现数据库统计时间戳按天分组输出数据的方法.分享给大家供大家参考,具体如下: 比如统计每天用户注册数,数据库表存了一张用户注册记录表: create table table_name(id int primary key,register_time int(10)); register_time记录的是时间戳,以前的做法是,接收查询开始时间.查询结束时间,然后循环查询每天的注册数量,代码: /* 查询2015-12-01 至 2015-12-14 */ // 开始的时间戳 $

  • postgreSql分组统计数据的实现代码

    1. 背景 比如气象台的气温监控,每半小时上报一条数据,有很多个地方的气温监控,这样数据表里就会有很多地方的不同时间的气温数据 2. 需求: 每次查询只查最新的气温数据按照不同的温度区间来分组查出,比如:高温有多少地方,正常有多少地方,低温有多少地方 3. 构建数据 3.1 创建表结构: -- DROP TABLE public.t_temperature CREATE TABLE public.t_temperature ( id int4 NOT NULL GENERATED ALWAYS

  • yii 框架实现按天,月,年,自定义时间段统计数据的方法分析

    本文实例讲述了yii 框架实现按天,月,年,自定义时间段统计数据的方法.分享给大家供大家参考,具体如下: 天(day): 格式Y-m-d 月(month):格式Y-m 年(year):格式Y 时间段(range): 格式Y-m-d 首先计算时间 天0-23小时 $rangeTime = range(0, 23); 月:1-月底 // $days = cal_days_in_month(CAL_GREGORIAN, $month, $year); $days = date("t",str

  • java根据数据库表内容生产树结构json数据的方法

    1.利用场景 组织机构树,通常会有组织机构表,其中有code(代码),pcode(上级代码),name(组织名称)等字段 2.构造数据(以下数据并不是组织机构数据,而纯属本人胡编乱造的数据) List<Tree<Test>> trees = new ArrayList<Tree<Test>>(); tests.add(new Test("0", "", "关于本人")); tests.add(new

  • MYSQL每隔10分钟进行分组统计的实现方法

    前言 本文的内容主要是介绍了MYSQL每隔10分钟进行分组统计的实现方法,在画用户登录.操作情况在一天内的分布图时会非常有用,之前我只知道用「存储过程」实现的方法(虽然执行速度快,但真的是太不灵活了),后来学会了用高级点的「group by」方法来灵活实现类似功能. 正文: -- time_str '2016-11-20 04:31:11' -- date_str 20161120 select concat(left(date_format(time_str, '%y-%m-%d %h:%i'

  • MySQL按时间统计数据的方法总结

    在做数据库的统计时,经常会需要根据年.月.日来统计数据,然后配合echarts来制作可视化效果. 数据库:MySQL 思路 按照时间维度进行统计的前提是需要数据库中有保留时间信息,建议是使用MySQL自带的datetime类型来记录时间. `timestamp` datetime DEFAULT NULL, 在MySQL中对于时间日期的处理的函数主要是DATE_FORMAT(date,format).可用的参数如下 格式 描述 %a 缩写星期名 %b 缩写月名 %c 月,数值 %D 带有英文前缀

  • Mysql出生日期转换为年龄并分组统计人数的方法示例

    查询数据库 SELECT * FROM `student` 查询结果 id name birthday 1 张三 1970-10-01 2 李四 1990-10-01 3 王五 2002-10-01 4 马六 2003-10-01 转换为年龄的查询语句,使用函数TIMESTAMPDIFF SELECT id, name, birthday, TIMESTAMPDIFF(YEAR,student.birthday,CURDATE()) as age FROM `student` 查询结果 d na

  • SQL按照日、周、月、年统计数据的方法分享

    --按日 select sum(consume),day([date]) from consume_record where year([date]) = '2006' group by day([date]) --按周quarter select sum(consume),datename(week,[date]) from consume_record where year([date]) = '2006' group by datename(week,[date]) --按月 select

  • oracle数据库表实现自增主键的方法实例

    目录 一.前言 二.实现主键自动增长 1.创建表格 2.创建自增序列 3.创建触发器 4.测试新增语句 总结 一.前言 几天建表需要用到自增主键,于是使用序列(sequence)和触发器(trigger)来实现主键自增,在网上查了一些知识,顺便记录下: 二.实现主键自动增长 1.创建表格 CREATE TABLE "APP_COMM_T" ( "ID" NUMBER, "BASE_KEY" VARCHAR2(50 BYTE), "BAS

随机推荐