在sql 中会用到与显示前/后一行内容,或者与前/后一行值作比较,这时就可以用到lead和lag函数。
lead(arg1,arg2) arg1表示列名,arg2表示向后行偏移量,默认为1。 当找不到值时返回null 。
lag(arg1,arg2) arg1表示列名,arg2表示向前行偏移量,默认为1。 当找不到值时返回null 。
原表(tel):
id name tel creatdate
1 A 001 2013-01-03
1 A 002 2013-01-10
2 B 003 2013-02-17
2 B 004 2013-02-20
例1:查询tel表中用户id、姓名、同一用户(id相同即为同一用户)的第一个号码、第二个号码、第一个号码与第二号码时间差。
select id,name,
tel as tel1,lead(tel) over (partition by id order by tel) as tel2,
creatdate,datediff(day,creatdate,lead(creatdate) over (partition by id order by creatdate)) as diff
from tel
where tel2 is not null
order by creatdate
id name tel1 tel2 creatdate diff
1 A 001 002 2013-01-03 7
2 B 003 004 2013-02-17 3
lag同lead用法一致,不同点在于lead向后偏移,lag向前偏移。