【问题标题】:LAG() / LEAD() of the next rank (Postgresql)下一个等级的 LAG() / LEAD() (Postgresql)
【发布时间】: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_yearnext_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


    【解决方案1】:

    您应该在数据集上使用 lag()lead() 函数,减少到每对 (client_id, rank) 的一行:

    select 
        client_id, order_id, product_id, 
        t.year, rank, prev_year, next_year
    from my_table t
    join (
        select distinct on (client_id, rank)
            client_id, rank, year, 
            lag(year) over w as prev_year, 
            lead(year) over w as next_year
        from my_table
        window w as (partition by client_id order by rank)
        order by 1, 2, 3 desc
        ) s using (client_id, rank)
    order by client_id, rank
    
     client_id | order_id | product_id | year | rank | prev_year | next_year 
    -----------+----------+------------+------+------+-----------+-----------
             1 |        1 |     212346 | 1995 |    1 |           |      1998
             1 |        1 |     912346 | 1995 |    1 |           |      1998
             1 |        1 |     111345 | 1995 |    1 |           |      1998
             1 |        2 |     133368 | 1998 |    4 |      1995 |      2005
             1 |        2 |     233368 | 1998 |    4 |      1995 |      2005
             1 |        3 |     412341 | 2005 |    6 |      1998 |          
             2 |       55 |     312344 | 1995 |    1 |           |      1999
             2 |       57 |     812343 | 1999 |    2 |      1995 |          
    (8 rows)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 2018-12-12
      相关资源
      最近更新 更多