oracle-按年、月、周、日、时、分 分组查询统计数据,无数据补零(connect by)
目的:统计一段时间内每年、每月、每周、每日、每时、每分数据,无数据时自动补零
思路:1. 生成给定时间段对应日期
2. 将原表中该时间段内的不为0的数据量统计出来
3. 用left join连接起来,无数据的自动补零
难点主要在于步骤一中生成该时间段对应的日期,话不多说,直接贴代码:
- - 获取某时间段内的每年
SELECT TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 4), 'yyyy'), (ROWNUM - 1) * 12), 'yyyy') AS DATES FROM DUAL
CONNECT BY ROWNUM <= CEIL(MONTHS_BETWEEN(TO_DATE(SUBSTR('2020-01-12 08:01:00', 1, 4), 'yyyy'), TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 4),
'yyyy')) / 12 +1)
- - 获取某时间段内的每月
SELECT TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 7), 'YYYY-MM'), ROWNUM - 1), 'YYYY-MM') AS DATES FROM DUAL
CONNECT BY ROWNUM <= CEIL(MONTHS_BETWEEN(TO_DATE(SUBSTR('2020-01-12 08:01:00', 1, 7), 'YYYY-MM'), TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 7),
'YYYY-MM'))+1)
- - 获取某时间段内的每周
SELECT TO_CHAR(TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 10), 'YYYY-MM-DD') + (ROWNUM - 1) * 7, 'IW') AS DATE FROM DUAL
CONNECT BY ROWNUM <=TRUNC(TO_DATE(SUBSTR('2020-01-12 08:01:00', 1, 10), 'YYYY-MM-DD') - TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 10),
'YYYY-MM-DD')) / 7 + 1
- - 获取某时间段内的每日
SELECT TO_CHAR(TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 10), 'yyyy-mm-dd') + ROWNUM - 1, 'yyyy-mm-dd') AS DATAS FROM DUAL
CONNECT BY ROWNUM <= TRUNC(TO_DATE(SUBSTR('2020-01-12 08:01:00', 1, 10), 'yyyy-mm-dd') - TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 10), 'yyyy-mm-dd')) + 1
- - 获取某时间段内的每时
SELECT to_char(TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 13), 'YYYY-MM-DD HH24') + (ROWNUM - 1) / 24,'yyyy-mm-dd HH24') AS DATES FROM DUAL
CONNECT BY ROWNUM <= floor(to_number(TO_DATE(SUBSTR('2020-01-12 08:01:00', 1, 13), 'yyyy-mm-dd HH24')-to_date(SUBSTR('2019-12-12 08:01:00', 1, 13),
'yyyy-mm-dd hh24'))*24 +1)
- - 获取某时间段内的每分
SELECT to_char(TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 16), 'YYYY-MM-DD HH24:MI') + (ROWNUM-1 ) / (24 * 60) ,'yyyy-mm-dd HH24:MI') AS DATES FROM DUAL
CONNECT BY ROWNUM <= floor(to_number(TO_DATE(SUBSTR('2020-01-12 08:01:00', 1, 16), 'yyyy-mm-dd HH24:MI')-to_date(SUBSTR('2019-12-12 08:01:00', 1, 16),
'yyyy-mm-dd hh24:MI'))*(24 * 60) +1)
完整版(以周为例)
SELECT NVL(D.DATA1, 0) POWER,NVL(D.UNIT, 'Week') UNIT, C.WEEK TIME1
FROM(SELECT TO_CHAR(TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 10), 'YYYY-MM-DD') + (ROWNUM - 1) * 7, 'IW') AS WEEK
FROM DUAL CONNECT BY ROWNUM <=
TRUNC(TO_DATE(SUBSTR('2020-01-12 08:01:00', 1, 10), 'YYYY-MM-DD') - TO_DATE(SUBSTR('2019-12-12 08:01:00', 1, 10), 'YYYY-MM-DD')) / 7 + 1)C
LEFT JOIN (SELECT SUM(DATA1) DATA1,TIME1,'Week' Unit
FROM (SELECT SUM(TO_NUMBER(DATA1)) DATA1,to_char(INSERT_TIME,'iw') Time1 FROM TABLE1
where to_char(INSERT_TIME,'yyyy-mm-dd')>=SUBSTR('2019-12-12 08:01:00', 1, 10) and
to_char(INSERT_TIME,'yyyy-mm-dd')<=SUBSTR('2020-01-12 08:01:00', 1, 10)
GROUP BY to_char(INSERT_TIME,'iw'))
GROUP BY TIME1)D
ON C.WEEK = D.TIME1
ORDER BY WEEK
Oracle connect by 基本语法:
select * from table [start with condition1]
connect by [prior] id=parentid
一般用来查找存在父子关系的数据,也就是树形结构的数据;其返还的数据也能够明确的区分出每一层的数据。
start with condition1 是用来限制第一层的数据,或者叫根节点数据;以这部分数据为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。
connect by [prior] id=parentid 这部分是用来指明oracle在查找数据时以怎样的一种关系去查找;比如说查找第二层的数据时用第一层数据的id去跟表里面记录的parentid字段进行匹配,如果这个条件成立那么查找出来的数据就是第二层数据,同理查找第三层第四层…等等都是按这样去匹配。
oracle-按年、月、周、日、时、分 分组查询统计数据,无数据补零(connect by)的更多相关文章
- Java统计用户年/月/周/日网站访问量
一:准备工作,引入相关依赖: 二:运行效果图: 下一次访问 三:具体代码如下 (1):CountObjectInfo.java package cn.csrc.base.count; import ...
- oracle 按每天,每周,每月,每季度,每年查询统计数据
oracle 按每天,每周,每月,每季度,每年查询统计数据 //按天统计 select count(dataid) as 每天操作数量, sum() from tablename group by t ...
- Java 获取年 月 日 时 分 秒
/** * 英文简写(默认)如:2010-12-01 */ public static String FORMAT_SHORT = "yyyy-MM-dd"; /** * 英文全称 ...
- ASP.NET C# 日期 时间 年 月 日 时 分 秒 格式及转换(转自happymagic的专栏)
在平时编码中,经常要把日期转换成各种各样的形式输出或保持,今天专门做了个测试,发现DateTime的ToString()方法居然有这么多的表现形式,和大家一起分享. DateTime time=Dat ...
- ASP.NET 日期 时间 年 月 日 时 分 秒 格式及转换
在平时编码中,经常要把日期转换成各种各样的形式输出或保持,今天专门做了个测试,发现DateTime的ToString()方法居然有这么多的表现形式,和大家一起分享. DateTime time=Dat ...
- ASP.NET C# 获取当前日期 时间 年 月 日 时 分 秒
我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...
- 12月22日《奥威Power-BI财务报表数据填报》腾讯课堂开课啦
一扇可以通向任何地方的“任意门”,是我们多少人幼时最梦寐以求的道具之一.即使到了现在,工作中的我们还会时不时有“世界那么大,我想去看看”的念头,或者在突然不想工作的时刻,幻想着自己的家门变成了“任意门 ...
- 【Oracle命令 】使用的sql语句之分组查询(group by)
由于本人并未对oracle数据库进行深入了解,但是工作中又需要知道一些基础的sql,所以记录下操作的sql语句.方便日后查看 1.将序列号作为分组查询的条件,再将查询出来的结果进行筛选. select ...
- oracle截取时间的年/月/日/时/分/秒
修改日期格式为年月日时分秒: alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';select to_char(sysdate,'yyy ...
随机推荐
- oracle 识别’低效执行’的SQL语句
用下列SQL工具找出低效SQL: SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_ ...
- typescript基础语法--变量/函数/指令/类
博客地址 :https://www.cnblogs.com/sandraryan/ 要把ts文件引入到html中,首先要转码为js文件. 步骤: 终端运行: npm i -g typescript t ...
- 5 分钟入门 Google 最强NLP模型:BERT
BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...
- 洛谷P1449 后缀表达式 题解 栈
题目链接:https://www.luogu.org/problem/P1449 这道题目我们只需要开一个栈,每次读取到一个数的话就将这个数 push 进栈. 因为提供给我们的时候已经是一个后续序列了 ...
- Vue打包后放到服务器出现Loading chunk {n} failed 错误
导航栏点击切换时 会出现Loading chunk {n} failed ,刷新之后便不会出现.而且n在最新的build的文件中,n没有存在 偶然一次发现,项目更新迭代开发时上传测试环境后就会出现, ...
- Java集合系统
前言: 要想学习java的集合体系,就必须先了解java的集合框架,总的来说,分为Collection和Map体系. Collection集合框架: Map集合框架: 一. Collection接口 ...
- @JsonIgnore @JsonIdentityInfo 处理Hibernate 循环引用的问题
enterprise和user一对一的关系: @Entity @Table(name = "enterprise") public class Enterprise extends ...
- 在spring security3中使用自定义的MD5和salt进行加密
首先看代码: <authentication-manager alias="authenticationManager"> <authentication-pro ...
- JSON怎样添加注释
今天在写一个程序的时候发现了一个问题,在json文件中添加注释之后,程序就出现bug了 于是,去搜了一下这个问题的相关解释,在这里和大家分享一下: JSON为什么不能添加注释? 这位外国友人给出的解释 ...
- 2019QLU.ACM集训队暑假训练须知
1.每场比赛都要认认真真参与并及时记录: 2.每个队员必须做一个单独的博客页面存放自己队伍或者个人的比赛结果和补题计划: 3.比赛记录参考样式:[1]dny[2]ECNU 4.每场比赛结束都会安排一支 ...