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

    2016-2017-1 <信息安全系统设计基础> 学生博客及Git@OSC 链接 博客 1452 20145201李子璇 20145202马 超 20145203盖泽双 20145204张 ...

  2. JS组件系列——Bootstrap寒冬暖身篇:弹出框和提示框效果以及代码展示

    前言:对于Web开发人员,弹出框和提示框的使用肯定不会陌生,比如常见的表格新增和编辑功能,一般常见的主要有两种处理方式:行内编辑和弹出框编辑.在增加用户体验方面,弹出框和提示框起着重要的作用,如果你的 ...

  3. kuangbin专题总结一 简单搜索

    A - 棋盘问题:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有 ...

  4. 【JavaScript】javascript 方法 test()

    个人理解:var b = x.test(y); y是否存在模式x中,返回true或false:x可以是正则,字符串,

  5. 【Python】[进程和线程]多进程,多线程,ThreadLocal,进程VS.线程,分布式进程

    1.多进程,multiprocessing模块,   进程间的通信:Queue[队列],Pipes[管子]2.多线程,    注意:线程公用变量,混乱   解决方法Lock:因为只有一个锁,所以当要执 ...

  6. python基础-RE正则表达式

    re 正则表示式 正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写 ...

  7. UIDynamic - 推动行为: UIPushBehavior

    用途: 从一个点移动到另外一个点; 相关属性: mode : UIPushBehaviorModeContinuous  //推移模式 angle : setAngle  //推移角度 magnitu ...

  8. get last dirname/filename in a file path argument

    $ dirname /home/train/00.incipient_data/data_for_gene_prediction_and_RNA-seq/240_rep2.fastq /home/tr ...

  9. iOS特殊字符处理

    你提供的 URL 字符串 里面可能包含某些字符,比如‘$‘ ‘&’ ‘?’...等,这些字符在 URL 语法中是具有特殊语法含义的, 比如 URL :http://www.baidu.com/ ...

  10. margin双边距的问题

    margin:20px;height:20px;float:left margin:20px;height:20px;float:left