按客户选择,他最近的订单中最贵的产品名称
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()
。请注意,此方法在您希望将哪些列包含在结果集中提供了很大的灵活性。
【讨论】:
以上是关于按客户选择,他最近的订单中最贵的产品名称的主要内容,如果未能解决你的问题,请参考以下文章