oracle-按年、月、周、日、时、分 分组查询统计数据,无数据补零(connect by)

时间:2022-08-02 23:43:08

目的:统计一段时间内每年、每月、每周、每日、每时、每分数据,无数据时自动补零

思路: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)的更多相关文章

  1. Java统计用户年&sol;月&sol;周&sol;日网站访问量

    一:准备工作,引入相关依赖: 二:运行效果图: 下一次访问 三:具体代码如下  (1):CountObjectInfo.java package cn.csrc.base.count; import ...

  2. oracle 按每天&comma;每周&comma;每月&comma;每季度&comma;每年查询统计数据

    oracle 按每天,每周,每月,每季度,每年查询统计数据 //按天统计 select count(dataid) as 每天操作数量, sum() from tablename group by t ...

  3. Java 获取年 月 日 时 分 秒

    /** * 英文简写(默认)如:2010-12-01 */ public static String FORMAT_SHORT = "yyyy-MM-dd"; /** * 英文全称 ...

  4. ASP&period;NET C&num; 日期 时间 年 月 日 时 分 秒 格式及转换(转自happymagic的专栏)

    在平时编码中,经常要把日期转换成各种各样的形式输出或保持,今天专门做了个测试,发现DateTime的ToString()方法居然有这么多的表现形式,和大家一起分享. DateTime time=Dat ...

  5. ASP&period;NET 日期 时间 年 月 日 时 分 秒 格式及转换

    在平时编码中,经常要把日期转换成各种各样的形式输出或保持,今天专门做了个测试,发现DateTime的ToString()方法居然有这么多的表现形式,和大家一起分享. DateTime time=Dat ...

  6. ASP&period;NET C&num; 获取当前日期 时间 年 月 日 时 分 秒

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...

  7. 12月22日《奥威Power-BI财务报表数据填报》腾讯课堂开课啦

    一扇可以通向任何地方的“任意门”,是我们多少人幼时最梦寐以求的道具之一.即使到了现在,工作中的我们还会时不时有“世界那么大,我想去看看”的念头,或者在突然不想工作的时刻,幻想着自己的家门变成了“任意门 ...

  8. 【Oracle命令 】使用的sql语句之分组查询(group by)

    由于本人并未对oracle数据库进行深入了解,但是工作中又需要知道一些基础的sql,所以记录下操作的sql语句.方便日后查看 1.将序列号作为分组查询的条件,再将查询出来的结果进行筛选. select ...

  9. oracle截取时间的年&sol;月&sol;日&sol;时&sol;分&sol;秒

    修改日期格式为年月日时分秒: alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';select to_char(sysdate,'yyy ...

随机推荐

  1. &lbrack;日常训练&rsqb;string

    Description 给定一个长度为$n$的字符串,串中的字符保证是前$k$个小写字母.你可以在字符串后再添加$m$个字符,使得新字符串所包含的不同的子序列数量尽量多.当然,前提是只能添加前$k$个 ...

  2. iOS图片加载到内存中占用内存情况

    我的测试结果: 图片占用内存   图片尺寸           .png文件大小 1MB              512*512          316KB 4MB              10 ...

  3. 一句话的代码,从集合中找出第一个重复字符的方法javascript版。

    有的时候需求是这样的: 找出集合中第一个重复的字符所在的位置,刚才看了园内某自许为算法的代码,感觉非常之啰嗦故写了以下代码! 本人对神马算法之类的完全不懂,但那些伪算法家们也别出来装蒜.一句话:不要欺 ...

  4. MVC,如何在视图中声明方法,调用方法?

    <div> <!--在视图中申明方法,此方法的类型已经固定为HelperResult--> @helper ShowHello(string s) { <div> ...

  5. IIS错误日志:Failed to execute request because the App-Domain

    装上IIS和.net2.0框架后,打开ASP.NET站点,出现Server Application Error,出先此问题,一般先看系统的“事件管理器”,于是查看服务器的“事件管理器”中的“应用程序” ...

  6. JS 创建对象的几种方式

    面向对象就是把属性和操作属性的方法放在一起作为一个相互依存的整体--对象,即拥有类的概念,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性! ECMA-262把对象定义为:"无 ...

  7. C语言内存对齐原理

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  8. 13款Linux运维比较实用的工具

    本文介绍几款Linux运维比较实用的工具,希望对Linux管理员有所帮助. 1.查看进程占用带宽情况-Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. ...

  9. OpenCV-Python:霍夫变换

    霍夫变换常用来在图像中提取直线和圆等几何形状.如下图: 我们下面来看看如何使用霍夫变换来检测直线.一条直线可以用数学表达式 y = mx + 或者 ρ = xcosθ + y sinθ表示(极坐标) ...

  10. MySQL的自动提交模式

      默认情况下, MySQL启用自动提交模式(变量autocommit为ON).这意味着, 只要你执行DML操作的语句,MySQL会立即隐式提交事务(Implicit Commit).这个跟SQL S ...