按客户选择,是他最近订购的最昂贵产品的名称

bwitn5fc  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(269)

我有两张table:
包含订单id、订单日期、客户id、产品id、收入的订单
包含产品标识和产品名称的产品
我想做的是按客户选择他最近订购的最贵产品的名称

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
qlzsbp2j

qlzsbp2j1#

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)
uelo1irk

uelo1irk2#

您所述的数据模型没有关于“最昂贵产品”的信息。让我假设 products 实际上有一个列,比如“price”。
我想我建议使用窗口功能:

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() . 请注意,对于要在结果集中包含的列,此方法提供了很大的灵活性。

相关问题