Oracle分段查询

网上查看分段查询的例子,用的最多的是LAG和LEAD统计函数,Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值。这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率。例如:

create table TEST
(
  GRADE NUMBER not null,
  STUID VARCHAR2(4)
);

insert into test (GRADE, STUID)values (1, '1001');
insert into test (GRADE, STUID)values (2, '1002');
insert into test (GRADE, STUID)values (3, '1003');
insert into test (GRADE, STUID)values (4, '1005');
insert into test (GRADE, STUID)values (5, '1006');
insert into test (GRADE, STUID)values (6, '1008');
insert into test (GRADE, STUID)values (7, '1010');
insert into test (GRADE, STUID)values (8, '1011');
insert into test (GRADE, STUID)values (9, '1012');
insert into test (GRADE, STUID)values (10, '1015');
insert into test (GRADE, STUID)values (11, '1017');
insert into test (GRADE, STUID)values (12, '1018');
insert into test (GRADE, STUID)values (13, '1020');
insert into test (GRADE, STUID)values (14, '1021');
insert into test (GRADE, STUID)values (21, '1022');
commit;

select (case when k - kk > 0 then kk || '~' || k else k || '' end) jg
  from (select k k, k2 k2,
               lag(k2, 1, (select min(stuid) from test)) over(order by k) as kk --1001起始值,对k列排序,取K2列中下一位是那个数字
          from (select *
                  from (select id1, id2,  id2 - id1,
                               (case when id2 - id1 = 1 then 1 else id1 end) k,   --如果不连续显示开始ID
                               (case when id2 - id1 = 1 then id1 else id2 end) k2 --如果不连续显示结束ID
                          from (select to_number(stuid) id1,
                                       lead(to_number(stuid), 1, (select min(stuid) from test)) over(order by stuid) as id2 --1001起始值,获取id1下个id
                                  from test))
                 where k > 1 --只取不连续数字
              )
      ) g
时间: 2024-11-09 05:57:49

Oracle分段查询的相关文章

数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> 数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例 实验所用数据表 子查询,解决一步不能求解 查询工资比scott高的员工信息: 子查询知识体系搭建: 解释3,查询部门是sales的员工信息: 方法1:子查询 [方法2]:多表: 优化考虑: 解释4[select],只能放单行子查询 解释4[from] 考题:显示员工姓名,薪水 解释

【Oracle 常用查询】oracle表空间使用率统计查询

参考1 --查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') || '

Oracle 模糊查询方法

在这个信息量剧增的时代,如何帮助用户从海量数据中检索到想要的数据,模糊查询是必不可少的.那么在Oracle中模糊查询是如何实现的呢? 一.我们可以在where子句中使用like关键字来达到Oracle模糊查询的效果:在Where子句中,可以对datetime.char.varchar字段类型的列用Like关键字配合通配符来实现模糊查询,以下是可使用的通配符: (1)% :零或者多个字符,使用%有三种情况 字段 like '%关键字%'字段包含"关键字"的记录 字段 like '关键字%

oracle 层次化查询(生成菜单树等)

1.简介:Oracle层次化查询是Oracle特有的功能实现,主要用于返回一个数据集,这个数据集存在树的关系(数据集中存在一个Pid记录着当前数据集某一条记录的Id). 2.层次化查询主要包含两个子句,一个start with另一个是connect by. start with:这个子句一般用于指定层次化查询的开始节点(也就是树的最顶级节点),找到最顶级节点,然后按照一定的规则开始查找其剩余的子节点 connect by:这个子句就是上面所说的规则,用于查找剩余子节点的规则 CREATE TAB

Oracle分页查询语句的写法(转)

分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHER

一个经典的数据库分段查询和分组查询综合运用的例子

记得以前面试时遇到的,感觉这个问题比较经典,所以后来整理了下. 题目描述是这样的(凭印象): 请用一条sql统计出每个班级中,20-50分.50-70分.70-100分的人数, 已知:表(exam),有如下字段:class(班级).name(姓名).score(分数): 查询显示格式: 这是个典型的分段又分组的查询案例,难点就是考虑到按班级分组的同时按成绩分段查询. 表数据如下: select count_abc.class 班级, sum(case when count_abc.a is nu

ORACLE 分页查询

Oracle之分页查询 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句.ROWNUM <= 40和RN >= 21控制分页查询的每页的范围.

Oracle生成查询包含指定字段名对应的所有数据表记录语句

应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,运行前修改成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库用户名变量,运行前修改成您要查询的数据库用户名mystring NV

Oracle单行查询

单行查询也叫作单行函数,使用某个函数对数据进行操作 关于基本查询:oracle基本查询 1 SQL> select lower('Hello WOrld') 转小写, 2 upper('Hello WOrld') 转大写, 3 initcap('hello world') 首字母大写 4 2 from dual; 5 6 7 SQL> --substr(a,b)取子串, 从a中,第b位开始取 ,直到末尾 8 SQL> select substr('Hello World',3) 子串 f