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)

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

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)是一样的。

 

posted @ 2021-12-05 15:42  数据库集中营  阅读(1702)  评论(0编辑  收藏  举报