数据库
首页 > 数据库> > PostgreSQL lag,lead获取记录前后的数据

PostgreSQL lag,lead获取记录前后的数据

作者:互联网

场景:获取该行与下一行某一字段数据,获取该行与上一行某一字段数据

1、测试数据:

postgres=# select * from tb1;

 id | name

----+------

  1 | aa

  2 | aa

  3 | aa

  4 | aa

  5 | aa

    | bb

    | cc

(7 rows)

2. lag(value any [, offset integer [, default any ]]):获取往前偏移offset的那行的某一字段的数据

参数值

说明

value any

指定某一字段

offset integer

向上的偏移量

default any

如果前后的行不存在,则填充的默认值


获取上一行的id值,不指定默认值

postgres=# select *,lag(id,1) over(order by id) from tb1;

 id | name | lead

----+------+------

  1 | aa   |      --第一行的上一行没有值,就用null填充

  2 | aa   |    1

  3 | aa   |    2

  4 | aa   |    3

  5 | aa   |    4

    | bb   |    5

    | cc   |    

(7 rows)

postgres=# select *,lag(id,1,100) over(order by id) from tb1;

 id | name | lag

----+------+-----

  1 | aa   | 100  --第一行的上一行没有值,就用指定的默认值100填充

  2 | aa   |   1

  3 | aa   |   2

  4 | aa   |   3

  5 | aa   |   4

    | bb   |   5

    | cc   |   

(7 rows)

postgres=# select *,lag(id,2,100) over(order by id) from tb1;

 id | name | lag

----+------+-----

  1 | aa   | 100

  2 | aa   | 100

  3 | aa   |   1

  4 | aa   |   2

  5 | aa   |   3

    | bb   |   4

    | cc   |   5

(7 rows)

-偏移量为-1

postgres=# select *,lag(id,-1,100) over(order by id) from tb1;

 id | name | lag

----+------+-----

  1 | aa   |   2

  2 | aa   |   3

  3 | aa   |   4

  4 | aa   |   5

  5 | aa   |   

    | bb   |   

    | cc   | 100

(7 rows)

当偏移量为负数的时候,就是取下面行的指定字段的值了。

3. lead(value any [, offset integer [, default any ]]):获取往后偏移offset的那行的某一字段的数据

postgres=# select *,lead(id,1,100) over(order by id) from tb1;

 id | name | lead

----+------+------

  1 | aa   |    2

  2 | aa   |    3

  3 | aa   |    4

  4 | aa   |    5

  5 | aa   |    

    | bb   |    

    | cc   |  100

(7 rows)

可以看到,lag(id, 1) 和 lead(id, -1)是一样的。

 

标签:aa,PostgreSQL,lead,tb1,lag,100,id,select
来源: https://www.cnblogs.com/zhenren001/p/15645819.html