赞
踩
我这里用的是oracle10,oracle11中有一个自增分区的。
我要实现的是:按照时间字段和功能字段进行分组,接着在分组的基础上进行排序后,选择若干记录作为我所需要的结果集,即分页的实现。
不知道大家有没有听懂,没听懂的就是我表述的有问题,大家见谅。
这里也实现了一个按照时间来进行表分区的分区表。表分区和分区表不是一个意思,表分区是一种思想,分区表是表分区的一种实现方式。
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;
首先来实现按照时间和用户点击操作名称进行分组
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
在上面的功能上来继续完善,上面完成了分组,这里就来实现分页。
分页语句如下,也是这次笔记的完整语句:
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起一个别名,这是用于最外层当中行数的获取的条件来的。
好了,如果看不懂的,还是我的问题,大家可以复制黏贴去看看,测试一下,就可以看到效果了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。