【问题标题】:SQL Window Function to find the second highest order date of each customer at the order levelSQL 窗口函数在订单级别查找每个客户的第二高订单日期
【发布时间】:2021-03-15 20:18:45
【问题描述】:

我有一个包含以下字段的表格:

| order_id  | order_date  | customer_id  | second_highest_order_date_of_the_customer
| 12345     | 2020-11-01  | customer_ABC | 2020-05-01
| 67891     | 2020-05-01  | customer_ABC | 2020-02-01
| 00531     | 2020-02-01  | customer_ABC | 2020-01-01
| 00789     | 2020-01-01  | customer_ABC | 

我发现很难在 SQL 中计算 second_highest_order_date_of_the_customer 列。 我可以使用窗口函数计算每个客户整体的第二高日期,但我很难在订单级别找到 second_highest_date,它不应该超过所述行中的 order_date。

非常感谢任何帮助

【问题讨论】:

    标签: sql datatable aggregate-functions window-functions presto


    【解决方案1】:

    nth_value() 窗口函数可以满足您的需求:

    select t.*,
           nth_value(order_date, 2) over (partition by customer_id order by order_date desc) as penultimate_order_date
    from t;
    

    如果英语不是您的第一语言,倒数第二个是一个漂亮的词,意思是“序列中倒数第二个”。

    【讨论】:

    • 感谢您的回复。我的数据库有重复的 order_ids 和 order_dates(购买的每件商品都有 1 个)。是否可以获得下一个最近的日期?
    • 我正在尝试获取订单级别的第二个最近日期。在订单 ID 为 00531 的第 3 个条目的原始示例中,我需要计算列给我“2020-01-01”,因为这是 customer_ABC 当时订购的第二个最近日期。但是您的代码给了我 2020-02-01,这是该客户总体上第二个最近的购买日期。如果您需要任何其他信息,请告诉我。再次感谢您的帮助
    猜你喜欢
    • 2015-04-29
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 2018-04-13
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多