【问题标题】:PostgreSQL window function & difference between datesPostgreSQL 窗口函数和日期之间的差异
【发布时间】:2018-04-07 05:26:38
【问题描述】:

假设我的数据格式如下(仅供参考,总行数超过 30K):

customer_id             order_date  order_rank
A                       2017-02-19  1
A                       2017-02-24  2
A                       2017-03-31  3
A                       2017-07-03  4
A                       2017-08-10  5
B                       2016-04-24  1
B                       2016-04-30  2
C                       2016-07-18  1
C                       2016-09-01  2
C                       2016-09-13  3

我需要第 4 列,我们称之为 days_since_last_order,如果 order_rank = 1 然后为 0,则计算自上一个订单以来的天数(排名为 n-1)。

所以,上面会返回:

customer_id             order_date  order_rank  days_since_last_order
A                       2017-02-19  1           0
A                       2017-02-24  2           5
A                       2017-03-31  3           35
A                       2017-07-03  4           94
A                       2017-08-10  5           38
B                       2016-04-24  1           0
B                       2016-04-30  2           6
C                       2016-07-18  1           79
C                       2016-09-01  2           45
C                       2016-09-13  3           12

有没有一种更简单的方法来使用窗口函数(或类似函数)而不是将整个数据集与自身连接起来(例如在 A.order_rank = B.order_rank - 1 上)并进行计算?

谢谢!

【问题讨论】:

    标签: postgresql amazon-redshift


    【解决方案1】:

    使用滞后窗口功能

    SELECT 
      customer_id
    , order_date
    , order_rank
    , COALESCE(
      DATE(order_date) 
        - DATE(LAG(order_date) OVER (PARTITION BY customer_id ORDER BY order_date)) 
      , 0)
    FROM <table_name>
    

    【讨论】:

    • order by order_date DESC ?
    • 不,在这种情况下排序应该是升序的,因为我是lagging 而不是leading
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2011-02-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多