解决上一户和下一户问题
这两个函数,是偏移量函数,其用途是:可以查出同一字段下一个值或上一个值。
lead(col_name,num,flag)
col_name是列名;num是取向下第几个值;flag是一个标志,也就是如果向下第几个值是空值的话就取flag;
例如lead(login_time,1,null)这个是向下取一个值,如果这个值为空则按空算,当然也可以用其他值替换。
lag(col_name,num,flag)
和lead类似,col_name是列名;num是取向上第几个值;flag是一个标志,也就是如果向上第几个值是空值的话就取flag;
例如lag(login_time,1,null)这个是向上取一个值,如果这个值为空则按空算,当然也可以用其他值替换。
举个例子:有一个表tmp_test(u_id,login_time)查一下这个表中连续7天都有登录机器的人是谁?
造下数据:
create table tmp_test(u_id number,login_time date);
insert into tmp_test
select 1 rn,sysdate + rownum as login_time
from dual
connect by level <=8
union
select 2 rn,sysdate + rownum as login_time
from dual
connect by level <=3
union
select 3 rn,sysdate + rownum as login_time
from dual
connect by level <=2
union
select 2 rn,sysdate + rownum+4 as login_time
from dual
connect by level <=5;
commit;
然后造几条重复数据:
insert into tmp_test
select 1 rn,sysdate + rownum as login_time
from dual
connect by level <=3;
查下数据:
select * from tmp_test; U_ID LOGIN_TIME
---------- -----------
1 2012/3/8 6:33:24
1 2012/3/9 6:33:24
1 2012/3/10 6:33:24
1 2012/3/11 6:33:24
1 2012/3/12 6:33:24
1 2012/3/13 6:33:24
1 2012/3/14 6:33:24
1 2012/3/15 6:33:24
2 2012/3/8 6:33:24
2 2012/3/9 6:33:24
2 2012/3/10 6:33:24
2 2012/3/12 6:33:24
2 2012/3/13 6:33:24
2 2012/3/14 6:33:24
2 2012/3/15 6:33:24
2 2012/3/16 6:33:24
3 2012/3/8 6:33:24
3 2012/3/9 6:33:24
1 2012/3/8 6:37:35
1 2012/3/9 6:37:35
1 2012/3/10 6:37:35
从上面数据看出其实只有u_id=1满足条件,那么怎么用sql实现呢?
SQL> select distinct u_id
2 from (select u_id,
3 login_time last_login_time,
4 lead(login_time, 6) over(partition by u_id order by u_id, login_time) next_login_time
5 from (select distinct u_id, trunc(login_time) login_time
6 from tmp_test))
7 where next_login_time - last_login_time = 6; U_ID
----------
1
ok,就是这个结果。其实用lag也可以实现相同结果,写法如下:
select distinct u_id
from (select u_id,
login_time last_login_time,
lag(login_time, 6) over(partition by u_id order by u_id, login_time) next_login_time
from (select distinct u_id, trunc(login_time) login_time
from tmp_test))
where last_login_time - next_login_time = 6;
 
 
 

oracle中lead和lag函数 (转载)的更多相关文章

  1. Oracle中的内置函数在sql中的转换整理

    程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...

  2. 用sql语句导出oracle中的存储过程和函数

    用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' repl ...

  3. Oracle中生成随机数的函数(转载)

    在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...

  4. oracle中110个常用函数介绍

    1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...

  5. Oracle中如何使用REGEXP_SUBSTR函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcst ...

  6. Oracle中如何使用REGEXP_SUBSTR函数动态截取字符串

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...

  7. oracle中next_day()、last_day()函数解析

    oracle中next_day()函数解析 Sql代码 当前系统时间的下一星期一的时间select   next_day(sysdate,1) from dual NEXT_DAY(date,char ...

  8. oracle 列相减——(Oracle分析函数Lead(),Lag())

    lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合 其实这2个函数的作用非常好理解,Lead()就是取当前顺序的下一条记录,相对Lag()就是 ...

  9. Oracle中生成随机数的函数

    在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...

随机推荐

  1. 如何通过ShadowSocket自动更新Chrome

    经常收到Chrome的更新提示,并下载更新程序后,报无法连接网络,然后更新不能了, 经过一段时间的搜索,找到了一条比较好的方法,分享一下: 1. 本机打开ShadowSocket 2. 打开Privo ...

  2. vue.js之绑定class和style

    一.绑定Class属性. 绑定数据用v-bind:命令,简写成: 语法:<div v-bind:class="{ active: isActive }"></di ...

  3. Warning: in_array() expects parameter 2 to be array, string given in D:\wamp\www\suiji.php on line 26

    可参考上篇文章  链接 PHP数组简写模式 同样是PHP版本问题:in_array()函数 第二个参数应该为数组 但是 lnmp下,PHP5.3不报错,wamp下PHP5.5报以下错误: echo & ...

  4. 为什么npm install在安装时会多安装很多依赖包

    比如我安装gulp时,会多出很多无用的包,如下图: 经过查询,原来是npm升级了导致的,在npm3.0以上的版本,包的依赖不再安装在每个架包的node_modules文件夹内,而是安装在顶层的node ...

  5. poj 2724 Purifying Machinef

    poj 2724 Purifying Machinef 题意 每一个01串中最多含有一个'*','*'既可表示0也可表示1,给出一些等长的这样的01串,问最少能用多少个这样的串表示出这些串.如:000 ...

  6. 用 Python、 RabbitMQ 和 Nameko 实现微服务

    用 Python. RabbitMQ 和 Nameko 实现微服务 原创 07-17 17:57 首页 Linux中国 "微服务是一股新浪潮" - 现如今,将项目拆分成多个独立的. ...

  7. eclipse中SSH三大框架环境搭建<二>

    通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...

  8. Android系统学习小记

    序言 Android 应用的启动到一个页面显示出来,这个过程涉及到点击事件的处理,以及如何启动一个Activity,启动一个Activity之后,如何将Activity中我们的设置的ContentVi ...

  9. 使用Nominatim进行openstreetmap地址搜索/解析

    Nominatim(来自拉丁语,意思是“名称”)是一个可以按名称和地址来搜索OSM中的数据,并生成OSM点的合成地址的工具(反向地理编码).可用在http://nominatim.openstreet ...

  10. 浅谈MVC中路由

    引言 学习ASP.NET MVC 路由这一关是肯定必不可少的.这一节,我们就来简单介绍下MVC中的路由机制.简单的路由机制相信大家都已了解,这一节主要介绍路由中很少使用的部分. 使用静态URL片段 在 ...