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

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

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 电子书章节表 a

where 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值)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9388950.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存