当前位置: 首页 > 面试题库 >

下一级的LAG()/ LEAD()(PostgreSQL)

周志文
2023-03-14
问题内容

有什么方法可以强制PostgreSQLLAG()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


问题答案:

您应该在数据集上使用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)


 类似资料:
  • 问题内容: 首先,我是熊猫的新手,但我已经爱上了它。我正在尝试实现与Oracle的滞后功能等效的功能。 假设您有以下DataFrame: 如果这是一个oracle数据库,而我想创建一个按“ Group”列分组并按Date排序的滞后函数,则可以轻松使用此函数: 这将产生下表: 在大熊猫中,我可以将日期设置为索引并使用shift方法: 唯一的问题是,这不会按列分组。即使将日期和组这两列设置为索引,我仍

  • 描述 (Description) 与普通文本相比,它是相当大的文本块,可用于广告或其他描述性文本。 例子 (Example) 以下示例演示了在Foundation中使用lead paragraph 。 <!doctype html> <html> <head> <title>Lead Paragraph</title> <link rel = "stylesheet"

  • 本文向大家介绍说一下 MyBatis 的一级缓存和二级缓存?相关面试题,主要包含被问及说一下 MyBatis 的一级缓存和二级缓存?时的应答技巧和注意事项,需要的朋友参考一下 一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的声明周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session f

  • 问题内容: 我正在尝试使用SQL Server 2012 LAG函数编写查询,以从我的[Order]表中检索数据,其中行与上一行之间的日期时间差小于等于2分钟。 我期望的结果是 但我看到了 最后一行不应该返回。这是我尝试过的:SQL Fiddle 任何有想法的人吗? 问题答案: 好吧,首先,我添加了一行以向您显示其他人的答案不起作用的地方,但他们现在将其删除了。 现在针对我查询中的逻辑。您说过您希

  • 我正在研究一个体育项目的投影模型,我需要了解某支球队最近的比赛: < li >他们的下一个对手是谁?(已解决) < li >他们的下一个对手是什么时候? 可以在下面使用的reprex。以第1行为例,我需要理解“a”的下一个对手“e”的最近一场比赛是game_id_3。 如果我能提供更多细节,请告诉我。

  • 一级缓存是session级别的缓存,默认开启,当查询一次数据库时,对查询结果进行缓存,如果之后的查询在一级缓存中存在,则无需再访问数据库; 二级缓存是sessionFactory级别的缓存,需要配置才会开启。当进行sql语句查询时,先查看一级缓存,如果不存在,访问二级缓存,降低数据库访问压力。