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
isatisfy_degree='satisfy_1'
and
iinsert_time<dt
and
iinsert_time>
ddt-2
group
by
ddt
例子中的sysdate
-
(level-1)
2得到的是一个间隔是2天的时间
group
by
ddt
也就是两天的时间间隔分组查询
自己实现例子:
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
ilocate_type
=
1
and
icreated_time<dt
and
icreated_time>
ddt-1/4
group
by
mobile_no,area_name,ddt
另外一个方法:
--按六小时分组
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)
这样似乎行:
select distinct bookid from 电子书章节表 awhere not exists(select 1 from 电子书章节表 b where visible <> 0 and abookid = bbookid)
Select 姓名,性别,Case 性别 When '女' Then Rownum When '男' Then Rownum - (Select Count() From 表名 Where 性别 = '女') End From 表名;
select axiaoqu ,adanjia from esf a, esfjj b where axiaoqu = b xiaoqu and adanjia > 095bjunjia group by axiaoqu,adanjia
select a
FROM ( select 班级,
学号,
总成绩,
其它信息
dense_rank() over(partition by 班级,学号 order by 总成绩 desc) 排名
from 年级成绩表
where
) a
where a排名<=3
注:允许有并列的情况,也可把dense_rank() 换成 rank()试试看有什么不同
1因为你使用了相等的条件进行限制,则相当于按照当前查询的t1b进行分组了
2你使用了Max()函数的时候只返回了一个值
3不算 子查询吧
比如第一行的时候为1 a a1
然后子查询会首先先筛选出b=a的记录,然后再求Max(),这样就返回4,然后在最外面判断t1a是不是等于4,如果不等于4就抛弃该条记录。
你自己想想就明白了
oracle用group分组查询数据最小的一条表中字段phonenumber,score,examtime
要取出时间段中phonenumber的score最大并且examtime最小的记录,用max和min取的值都不是正确的记录值,用排序子查询的方法可以取到数据最小的一条。
以上就是关于Oracle数据库按时间进行分组统计数据的方法全部的内容,包括:Oracle数据库按时间进行分组统计数据的方法、oracle 分组查询、oracle数据库如何将查询出来的数据分组合并,并加上顺序号(注:顺序号不是ID值)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)