摘自:https://www.cnblogs.com/always-online/p/5010185.html

一、简介

  lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤。这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。

over()表示 lag()与lead()操作的数据都在over()的范围内,他里面可以使用partition by 语句(用于分组) order by 语句(用于排序)。partition by a order by b表示以a字段进行分组,再 以b字段进行排序,对数据进行查询。

  例如:lead(field, num, defaultvalue) field需要查找的字段,num往后查找的num行的数据,defaultvalue没有符合条件的默认值。

二、示例

  1、表机构与初始化数据如下

复制代码
  1. 1 -- 表结构
  2. 2 create table tb_test(
  3. 3 id varchar2(64) not null,
  4. 4 cphm varchar2(10) not null,
  5. 5 create_date date not null,
  6. 6 primary key (id)
  7. 7 )
  8. 8 -- 初始化数据
  9. 9 insert into tb_test values (\'1000001\', \'AB7477\', to_date(\'2015-11-30 10:18:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  10. 10 insert into tb_test values (\'1000002\', \'AB7477\', to_date(\'2015-11-30 10:22:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  11. 11 insert into tb_test values (\'1000003\', \'AB7477\', to_date(\'2015-11-30 10:28:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  12. 12 insert into tb_test values (\'1000004\', \'AB7477\', to_date(\'2015-11-30 10:29:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  13. 13 insert into tb_test values (\'1000005\', \'AB7477\', to_date(\'2015-11-30 10:39:13\',\'YYYY-MM-DD HH24:mi:ss\'));
  14. 14 insert into tb_test values (\'1000006\', \'AB7477\', to_date(\'2015-11-30 10:45:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  15. 15 insert into tb_test values (\'1000007\', \'AB7477\', to_date(\'2015-11-30 10:56:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  16. 16 insert into tb_test values (\'1000008\', \'AB7477\', to_date(\'2015-11-30 10:57:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  17. 17 -- ---------------------
  18. 18 insert into tb_test values (\'1000009\', \'AB3808\', to_date(\'2015-11-30 11:00:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  19. 19 insert into tb_test values (\'1000010\', \'AB3808\', to_date(\'2015-11-30 11:10:13\',\'YYYY-MM-DD HH24:mi:ss\'));
  20. 20 insert into tb_test values (\'1000011\', \'AB3808\', to_date(\'2015-11-30 11:15:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  21. 21 insert into tb_test values (\'1000012\', \'AB3808\', to_date(\'2015-11-30 11:26:12\',\'YYYY-MM-DD HH24:mi:ss\'));
  22. 22 insert into tb_test values (\'1000013\', \'AB3808\', to_date(\'2015-11-30 11:30:12\',\'YYYY-MM-DD HH24:mi:ss\'));
复制代码

  表初始化数据为:

  

  2、示例

  a、获取当前记录的id,以及下一条记录的id  

  1. select t.id id ,
  2. lead(t.id, 1, null) over (order by t.id) next_record_id, t.cphm
  3. from tb_test t
  4. order by t.id asc

  运行结果如下:

  

  b、获取当前记录的id,以及上一条记录的id

  1. select t.id id ,
  2. lag(t.id, 1, null) over (order by t.id) next_record_id, t.cphm
  3. from tb_test t
  4. order by t.id asc

  运行结果如下:

  

  c、获取号牌号码相同的,当前记录的id与,下一条记录的id(使用partition by)

  1. select t.id id,
  2. lead(t.id, 1, null) over(partition by cphm order by t.id) next_same_cphm_id, t.cphm
  3. from tb_test t
  4. order by t.id asc

  运行结果如下:

  

  d、查询 cphm的总数,当create_date与下一条记录的create_date时间间隔不超过10分钟则忽略。

复制代码
  1. 1 select cphm, count(1) total from
  2. 2 (
  3. 3 select t.id,
  4. 4 t.create_date t1,
  5. 5 lead(t.create_date,1, null) over( partition by cphm order by create_date asc ) t2,
  6. 6 ( lead(t.create_date,1, null) over( partition by cphm order by create_date asc ) - t.create_date ) * 86400 as itvtime,
  7. 7 t.cphm
  8. 8 from tb_test t
  9. 9 order by t.cphm, t.create_date asc
  10. 10 ) tt
  11. 11 where tt.itvtime >= 600 or tt.itvtime is null
  12. 12 group by tt.cphm
复制代码

  结果如下:

  

版权声明:本文为51linux原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/51linux/p/9139929.html