Oracle query that count connections by minute with start and end times provided
2015-06-30 05:51
489 查看
数据结构类似
SQL> select * from t;
B E N
----------------- ----------------- --------------------
20150106 01:00:02 20150106 01:00:42 A
20150106 01:00:02 20150106 01:00:12 B
20150106 02:01:02 20150106 01:10:03 C
20150106 02:01:07 20150106 02:01:08 D
20150106 02:00:01 20150106 02:00:02 E
20150106 01:00:03 20150106 01:00:07 F
6 rows selected.
数据表定义
SQL> @desc t
Name Null? Type
------------------------------- -------- ----------------------------
1 B DATE
2 E DATE
3 N VARCHAR2(10)
需求抽象
以分钟为单位统计指定天每分钟内N的个数。
思路:
1、每天1440分钟,构造全天的分钟集合
[align=left]SELECT to_date('20150106 00:00:00' , 'yyyy-mm-dd hh24:mi:ss') +[/align]
[align=left] numtodsinterval (level , 'minute') dt[/align]
[align=left] FROM dual[/align]
[align=left] CONNECT BY level <= 24 * 60[/align]
[align=left] [/align]
[align=left]2、左外连接,条件 dt >= begin and dt < end + 1[/align]
[align=left] [/align]
[align=left]3、需要截取t.begin 和 t.end到分钟[/align]
[align=left]对于begin , trunc(begin,'mi')[/align]
[align=left]对于end , trunc(end+ numtodsinterval(1, 'minute'),'mi')) // trunc( end + 1 ,[format])[/align]
[align=left] [/align]
[align=left]4、按分钟聚合统计[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]结果[/align]
[align=left]WITH each_minute AS[/align]
[align=left] ( SELECT to_date( '20150106 00:00:00' , 'yyyy-mm-dd hh24:mi:ss' ) +[/align]
[align=left] numtodsinterval (level , 'minute') dt[/align]
[align=left] FROM dual[/align]
[align=left] CONNECT BY level <= 24 * 60 )[/align]
[align=left]SELECT trunc (em.dt, 'mi') d, count (t.n) cnt[/align]
[align=left] FROM each_minute em[/align]
[align=left] LEFT OUTER JOIN t[/align]
[align=left] ON (em.dt >= trunc (t.b, 'mi') AND em.dt < trunc (t.e+ numtodsinterval (1 , 'minute'), 'mi' ))[/align]
[align=left]group by trunc(em.dt, 'mi' )[/align]
[align=left]order by 1;[/align]
[align=left] [/align]
[align=left]简单测试[/align]
SQL> WITH each_minute AS
2 (SELECT to_date('20150106 00:00:00', 'yyyy-mm-dd hh24:mi:ss') +
3 numtodsinterval(level, 'minute') dt
4 FROM dual
5 CONNECT BY level <= 24 * 60)
6 SELECT trunc(em.dt, 'mi') d, count(t.n) cnt
7 FROM each_minute em
8 LEFT OUTER JOIN t
9 ON (em.dt >= trunc(t.b, 'mi') AND
10 em.dt < trunc(t.e + numtodsinterval(1, 'minute'), 'mi'))
11 where t.n is not null -- no need for 1440,just for test.
12 group by trunc(em.dt, 'mi')
13 order by 1;
D CNT
----------------- ----------
20150106 01:00:00 3
20150106 02:00:00 1
20150106 02:01:00 1
SQL> select * from t;
B E N
----------------- ----------------- --------------------
20150106 01:00:02 20150106 01:00:42 A
20150106 01:00:02 20150106 01:00:12 B
20150106 02:01:02 20150106 01:10:03 C
20150106 02:01:07 20150106 02:01:08 D
20150106 02:00:01 20150106 02:00:02 E
20150106 01:00:03 20150106 01:00:07 F
6 rows selected.
数据表定义
SQL> @desc t
Name Null? Type
------------------------------- -------- ----------------------------
1 B DATE
2 E DATE
3 N VARCHAR2(10)
需求抽象
以分钟为单位统计指定天每分钟内N的个数。
思路:
1、每天1440分钟,构造全天的分钟集合
[align=left]SELECT to_date('20150106 00:00:00' , 'yyyy-mm-dd hh24:mi:ss') +[/align]
[align=left] numtodsinterval (level , 'minute') dt[/align]
[align=left] FROM dual[/align]
[align=left] CONNECT BY level <= 24 * 60[/align]
[align=left] [/align]
[align=left]2、左外连接,条件 dt >= begin and dt < end + 1[/align]
[align=left] [/align]
[align=left]3、需要截取t.begin 和 t.end到分钟[/align]
[align=left]对于begin , trunc(begin,'mi')[/align]
[align=left]对于end , trunc(end+ numtodsinterval(1, 'minute'),'mi')) // trunc( end + 1 ,[format])[/align]
[align=left] [/align]
[align=left]4、按分钟聚合统计[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]结果[/align]
[align=left]WITH each_minute AS[/align]
[align=left] ( SELECT to_date( '20150106 00:00:00' , 'yyyy-mm-dd hh24:mi:ss' ) +[/align]
[align=left] numtodsinterval (level , 'minute') dt[/align]
[align=left] FROM dual[/align]
[align=left] CONNECT BY level <= 24 * 60 )[/align]
[align=left]SELECT trunc (em.dt, 'mi') d, count (t.n) cnt[/align]
[align=left] FROM each_minute em[/align]
[align=left] LEFT OUTER JOIN t[/align]
[align=left] ON (em.dt >= trunc (t.b, 'mi') AND em.dt < trunc (t.e+ numtodsinterval (1 , 'minute'), 'mi' ))[/align]
[align=left]group by trunc(em.dt, 'mi' )[/align]
[align=left]order by 1;[/align]
[align=left] [/align]
[align=left]简单测试[/align]
SQL> WITH each_minute AS
2 (SELECT to_date('20150106 00:00:00', 'yyyy-mm-dd hh24:mi:ss') +
3 numtodsinterval(level, 'minute') dt
4 FROM dual
5 CONNECT BY level <= 24 * 60)
6 SELECT trunc(em.dt, 'mi') d, count(t.n) cnt
7 FROM each_minute em
8 LEFT OUTER JOIN t
9 ON (em.dt >= trunc(t.b, 'mi') AND
10 em.dt < trunc(t.e + numtodsinterval(1, 'minute'), 'mi'))
11 where t.n is not null -- no need for 1440,just for test.
12 group by trunc(em.dt, 'mi')
13 order by 1;
D CNT
----------------- ----------
20150106 01:00:00 3
20150106 02:00:00 1
20150106 02:01:00 1
相关文章推荐
- ORACLE 如何查询被锁定表及如何解锁释放session
- 两个oracle数据库如何做数据交换
- oracle分组写法
- oracle_10g_flashback(数据恢复)
- oracle建立表空间用户,导入导出命令
- Oracle的卸载
- Java版权案谷歌上诉被驳回 甲骨文笑到最后
- oracle 11g及以上版本密码过期
- Window XP安装oracle11gR2数据库先决条件检查的问题解决(实测有效)
- ORACLE
- Oracle中DDL语句对事务的影响
- Oracle PLSQL Demo - 31.执行动态SQL拿一个返回值
- Oracle PLSQL Demo - 29.01.Function结构模板 [无入参] [有返回]
- Oracle PLSQL Demo - 27.Declare & Run Sample
- Oracle PLSQL Demo - 24.分隔字符串function
- Oracle PLSQL Demo - 22.查看字符串的长度[lengthb, length],判断字符串是否包含中文
- Oracle PLSQL Demo - 20.弱类型REF游标[没有指定查询类型,也不指定返回类型]
- Oracle PLSQL Demo - 19.管道function[查询整表组成list管道返回]
- Oracle PLSQL Demo - 18.02.管道function[查询零散的字段组成list管道返回] [字段必须对上]
- Oracle PLSQL Demo - 18.01管道function[查询零散的字段组成list管道返回]