按客户选择,他最近的订单中最贵的产品名称

Posted

技术标签:

【中文标题】按客户选择,他最近的订单中最贵的产品名称【英文标题】:Select by customer, the name of the most expensive product of his most recent order 【发布时间】:2020-11-27 13:44:06 【问题描述】:

我有 2 张桌子:

包含 order_id、order_date、customer_id、product_id、receiver 的订单 包含 product_id 和 product_name 的产品

我要做的是按客户选择,他最近的订单中最贵的产品的名称

SELECT MAX(o.ORDER_DATE), MAX(o.REVENUE) , PRODUCT_NAME
FROM orders o 
JOIN products p ON o.PRODUCT_ID = p.PRODUCT_ID
GROUP BY CUSTOMER_ID, ORDER_ID, PRODUCT_NAME

【问题讨论】:

您能否提供一些示例数据,以及您想要的结果 @Pauline 。 . .您声明的数据模型没有关于产品价格的信息。 【参考方案1】:
SELECT DISTINCT
       MAX(o.order_date) OVER (PARTITION BY customer_id) order_date, 
       FIRST_VALUE(o.revenue) OVER (PARTITION BY customer_id 
                                    ORDER BY order_date DESC, revenue DESC) revenue, 
       FIRST_VALUE(product_name) OVER (PARTITION BY customer_id 
                                       ORDER BY order_date DESC, revenue DESC) product_name       
FROM orders o 
JOIN products p USING (product_id)

【讨论】:

【参考方案2】:

您声明的数据模型没有关于“最昂贵的产品”的信息。让我假设products 实际上有一个列,例如“价格”。

我想我会建议窗口函数:

SELECT op.*
FROM (SELECT o.*, p.*
             ROW_NUMBER() OVER (PARTITION BY o.customer_id ORDER BY o.order_date DESC, p.price DESC) as seqnum
      FROM orders o JOIN
           products p
           ON o.PRODUCT_ID = p.PRODUCT_ID
     ) op
WHERE seqnum = 1;

这将为每位客户返回一行。如果出现平局并且您想要所有行,请将ROW_NUMBER() 更改为RANK()。请注意,此方法在您希望将哪些列包含在结果集中提供了很大的灵活性。

【讨论】:

以上是关于按客户选择,他最近的订单中最贵的产品名称的主要内容,如果未能解决你的问题,请参考以下文章

最贵的显卡是啥型号2021

P2073 送花

[Luogu2073]送花

光模块的选择和使用注意事项

趣谈 史上最贵的“风火轮”

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