oracle中lead和lag函数 (转载)
解决上一户和下一户问题
这两个函数,是偏移量函数,其用途是:可以查出同一字段下一个值或上一个值。
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函数 (转载)的更多相关文章
- Oracle中的内置函数在sql中的转换整理
程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...
- 用sql语句导出oracle中的存储过程和函数
用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' repl ...
- Oracle中生成随机数的函数(转载)
在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...
- oracle中110个常用函数介绍
1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...
- Oracle中如何使用REGEXP_SUBSTR函数
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcst ...
- Oracle中如何使用REGEXP_SUBSTR函数动态截取字符串
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...
- oracle中next_day()、last_day()函数解析
oracle中next_day()函数解析 Sql代码 当前系统时间的下一星期一的时间select next_day(sysdate,1) from dual NEXT_DAY(date,char ...
- oracle 列相减——(Oracle分析函数Lead(),Lag())
lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合 其实这2个函数的作用非常好理解,Lead()就是取当前顺序的下一条记录,相对Lag()就是 ...
- Oracle中生成随机数的函数
在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...
随机推荐
- 尝试使用Memcached遇到的狗血问题
乘着有时间,尝试下利用Memcached进行分布式缓存,其中遇到了不少问题及狗血的事情,开篇记录下,希望对您有帮助. 我之前的项目为:Asp.Net MVC4 + Nhibernate + MSSQL ...
- SQLite剖析之临时文件、内存数据库
一.7种临时文件 SQLite中,一个数据库由单个磁盘文件构成,简化了SQLite的使用,因为移动或备份数据库只要拷贝单个文件即可.这也使得SQLite适合用作应用程序文件格式.但是,当在单个文 ...
- python基础-迭代器和生成器
一.递归和迭代 1.递归:(问路示例) 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 2.迭代:简单理 ...
- RGW/SWIFT对象存储性能测试工具--COSBench安装
Cosbench是Intel的开源云存储性能测试软件,COSBench目前已经广泛使用与云存储测试,并作为云存储的基准测试工具使用 https://github.com/intel-cloud/cos ...
- MySql分页算法
PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇"Efficient Pagination Using MySQL"的报告, ...
- 【转】单调队列优化DP
转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...
- java-工具类-读取配置文件
java读取配置文件,当发现文件被修改后则重新加载 package com.zg.config; import java.io.File; import java.io.FileInputStream ...
- js判断用户的浏览设备是移动设备还是PC
<script type="text/javascript"> function browserRedirect() { var sUserAgent = naviga ...
- Nginx高级使用
1.用户认证 客户端访问限制deny 客户端地址: 拒绝访问allow 客户端地址: 允许访问 rpm -q httpd-tools yum -y install httpd-tools user h ...
- javascript变量声明 及作用域
javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...