【发布时间】:2018-03-28 12:40:09
【问题描述】:
有什么方法可以强制 PostgreSQL LAG() 和 LEAD() 函数使用不是来自前行而是来自同一分区的下一个排名的值?
---------------------------------------------------
| client_id | order_id | product_id | year | rank |
---------------------------------------------------
| 1 | 1 | 111345 | 1995 | 1 |
| 1 | 1 | 912346 | 1995 | 1 |
| 1 | 1 | 212346 | 1995 | 1 |
| 1 | 2 | 233368 | 1998 | 4 |
| 1 | 2 | 133368 | 1998 | 4 |
| 1 | 3 | 412341 | 2005 | 6 |
| 2 | 55 | 312344 | 1995 | 1 |
| 2 | 57 | 812343 | 1999 | 2 |
---------------------------------------------------
预期结果是:
---------------------------------------------------------------------------
| client_id | order_id | product_id | year | rank | prev_year | next_year |
---------------------------------------------------------------------------
| 1 | 1 | 111345 | 1995 | 1 | null | 1998 |
| 1 | 1 | 912346 | 1995 | 1 | null | 1998 |
| 1 | 1 | 212346 | 1995 | 1 | null | 1998 |
| 1 | 2 | 233368 | 1998 | 4 | 1995 | 2005 |
| 1 | 2 | 133368 | 1998 | 4 | 1995 | 2005 |
| 1 | 3 | 412341 | 2005 | 6 | 1998 | null |
| 2 | 55 | 312344 | 1995 | 1 | null | 1999 |
| 2 | 57 | 812343 | 1999 | 2 | 1995 | null |
---------------------------------------------------------------------------
如果year 在给定等级中有不同 值,那么prev_year 和next_year 可以是这些值中的任何一个。例如:
---------------------------------------------------------------------------
| client_id | order_id | product_id | year | rank | prev_year | next_year |
---------------------------------------------------------------------------
| 1 | 1 | 111345 | 1994 | 1 | null | 1998 |
| 1 | 1 | 912346 | 1995 | 1 | null | 1998 |
| 1 | 1 | 212346 | 1996 | 1 | null | 1998 |
| 1 | 2 | 233368 | 1998 | 4 | ???? | null |
???? 可以等于 1994、1995 或 1996
【问题讨论】:
标签: sql postgresql