SQL 窗口函数在订单级别查找每个客户的第二高订单日期

Posted

技术标签:

【中文标题】SQL 窗口函数在订单级别查找每个客户的第二高订单日期【英文标题】:SQL Window Function to find the second highest order date of each customer at the order level 【发布时间】: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。

非常感谢任何帮助

【问题讨论】:

【参考方案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,这是该客户总体上第二个最近的购买日期。如果您需要任何其他信息,请告诉我。再次感谢您的帮助

以上是关于SQL 窗口函数在订单级别查找每个客户的第二高订单日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL:查找第 n 个客户的第 n 个订单

使用AGGREGATE函数过滤掉$ 0的所有订单

SQL 他们的第一个订单和第二个订单的购买价值之间的差异

如何获取客户的用户 ID 以及他们使用聚合或窗口函数下的每个订单?

查询以查找每组的第二高值

SQL - 显示每个部门的第二高工资,如果员工具有相同的工资,则显示最低工资的工资