在oracle中实现分页和分组统计

我这里用的是oracle10,oracle11中有一个自增分区的。

1 首先来说一下需求:

我要实现的是:按照时间字段和功能字段进行分组,接着在分组的基础上进行排序后,选择若干记录作为我所需要的结果集,即分页的实现。
不知道大家有没有听懂,没听懂的就是我表述的有问题,大家见谅。

2 接着创建一个id自增的数据表

这里也实现了一个按照时间来进行表分区的分区表。表分区和分区表不是一个意思,表分区是一种思想,分区表是表分区的一种实现方式。

create table OFE_MENU_USER
(
  menu_id       INTEGER not null,
  username      VARCHAR2(31),
  parent_menu   VARCHAR2(31),
  sub_operation VARCHAR2(50),
  click_count   NUMBER,
  createtime    DATE
)
partition by range (CREATETIME)
(
  partition OMU_20181101 values less than (TO_DATE(' 2018-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace OFE
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
    partition OMU_20181201 values less than (TO_DATE(' 2018-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace OFE
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    )
 )
--- 在创建了数据表后,再来创建自增id,自增id需要用到序列和触发器
DROP SEQUENCE ofe_menu_user_seq;---第一次执行可忽略此句
CREATE SEQUENCE ofe_menu_user_seq MINVALUE 1 MAXVALUE 99999999
INCREMENT BY 1
START WITH 1;

CREATE OR REPLACE TRIGGER ofe_menu_user_tb_tri
BEFORE INSERT ON ofe_menu_user
FOR EACH ROW
  BEGIN
    SELECT ofe_menu_user_seq.nextval INTO :new.menu_id FROM dual;
  END;

--- 测试插入操作
INSERT INTO OFE_MENU_USER(username,parent_menu,Sub_Operation,Click_Count,createtime)
VALUES('TEST01','父菜单','子菜单',1,to_date('2018/11/16','yyyy/MM/dd'));
commit;
select * ofe_menu_user;
3 现在就进入主题

首先来实现按照时间和用户点击操作名称进行分组

SELECT TO_CHAR(createtime,'YYYY/MM/DD') TIME,
		SUM(click_count) sumCount,
		sub_operation 
FROM OFE_MENU_USER
WHERE 
	TO_CHAR(createtime,'YYYY') = TO_CHAR(SYSDATE,'YYYY') 
GROUP BY TO_CHAR(createtime,'YYYY/MM/DD'),sub_operation
ORDER BY SUM(click_count) DESC

上面的sql语句中,是按照天来进行分组的,还有按照月,年来进行分组的,相应的只需要改变 to_char()部分的内容即可;
若还想要实现按照用户点击名称分组,则只需在group by后面再加上你要的分组名字。

再此基础上,我还想要某一段时间的数据,这时可以使用between and语句来实现。或者是>= 和 <= 一起是用来实现。
语句如下:

SELECT TO_CHAR(createtime,'YYYY/MM/DD') TIME,
		SUM(click_count) sumCount,
		sub_operation 
FROM OFE_MENU_USER
WHERE 
	TO_CHAR(createtime,'YYYY') = TO_CHAR(SYSDATE,'YYYY') 
	AND createtime >= to_date('2018/11/10','yyyy/MM/dd')
    	AND createtime <= to_date('2018/11/19','yyyy/MM/dd')
GROUP BY TO_CHAR(createtime,'YYYY/MM/DD'),sub_operation
ORDER BY SUM(click_count) DESC
4 分页

在上面的功能上来继续完善,上面完成了分组,这里就来实现分页。
分页语句如下,也是这次笔记的完整语句

SELECT 
	sc.time AS xTime,
	sc.sumCount AS xCount,
	sc.sub_operation AS subOperation 
FROM
  	(SELECT 
  		oc.*,ROWNUM rn 
  	FROM
    		(SELECT 
    			TO_CHAR(createtime,'YYYY/MM/DD') TIME,
    			SUM(click_count) sumCount,
    			sub_operation 
    		FROM 
    			OFE_MENU_USER
    		WHERE 
    			TO_CHAR(createtime,'YYYY') = TO_CHAR(SYSDATE,'YYYY') 
          		AND createtime >= to_date('2018/11/10','yyyy/MM/dd') 
          		AND createtime <= to_date('2018/11/19','yyyy/MM/dd')
    		GROUP BY 
    			TO_CHAR(createtime,'YYYY/MM/DD'),
    			sub_operation,parent_menu
    		ORDER BY SUM(click_count) DESC) oc
   	) sc
WHERE rn >=5 AND rn <=10;

好了,这是典型的oracle分页语句,三层嵌套。。。
注意,在第二层嵌套中一定要给ROWNUM起一个别名,这是用于最外层当中行数的获取的条件来的。

好了,如果看不懂的,还是我的问题,大家可以复制黏贴去看看,测试一下,就可以看到效果了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值