Выберите покупателем название самого дорогого продукта из его последнего заказа. - PullRequest
0 голосов
/ 07 августа 2020

У меня есть 2 таблицы:

  • заказы, содержащие order_id, order_date, customer_id, product_id, доход
  • продукты, содержащие 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

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

В указанной вами модели данных нет информации о «самом дорогом продукте». Позвольте предположить, что 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;

Это возвращает одну строку для каждого клиента. Если есть ie и вам нужны все строки, измените ROW_NUMBER() на RANK(). Обратите внимание, что этот метод дает вам большую гибкость при выборе столбцов, которые вы хотите включить в набор результатов.

0 голосов
/ 07 августа 2020
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)
...