MySQL: верните самый продаваемый продукт за месяц с помощью Query - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь написать запрос, который должен вернуть самый продаваемый продукт в месяц. Есть 4 разных продукта.

Таблица Product_Sales имеет 3 атрибута: Product_ID (4 типа), Purchase_ID (уникальная и 1 покупка для продукта) и Purchase_Date:

У меня текущий запрос:

SELECT MONTHNAME(Purchase_Date) as "Month",  Product_ID, Count(*) as "Sales_Amount"
FROM Product_Sales
GROUP BY MONTH(Purchase_Date), MONTHNAME(Purchase_Date)
ORDER BY MONTH(Purchase_Date);

В настоящее время возвращается:

+------------+----------+--------------+
|    Month   |Product_ID| Sales_Amount |
+------------+----------+--------------+
|   January  |    1     |      220     |
|   January  |    2     |      192     |
|   January  |    3     |      288     |
|   January  |    4     |      173     |
|  February  |    1     |      252     |
|  February  |    2     |      199     |
...etc.

Я могу видеть по таблице, какой Продукт продан больше всего за каждый месяц. Но я пытаюсь сделать запрос, который возвращает только самый продаваемый продукт за этот месяц, таким образом, название месяца, идентификатор продукта и объем продаж для этого продукта в этом месяце. Я не смог использовать метод MAX. Я хотел бы, чтобы вместо этого он возвращал:

+------------+----------+--------------+
|    Month   |Product_ID| Sales_Amount |
+------------+----------+--------------+
|   January  |    3     |      288     |
|   February |    1     |      252     |
|    March   |    3     |      288     |
|    April   |    2     |      343     |
|     May    |    1     |      272     |
etc...

Я не уверен, что для этого потребуется, чтобы я создал функцию или подзапрос.

Любой совет или помощь приветствуются!

1 Ответ

0 голосов
/ 20 октября 2019

Поскольку вы используете MySQL версии 8.0 или выше, вы можете использовать оконную функцию -

SELECT Month, Product_ID, Sales_Amount
FROM (SELECT MONTHNAME(Purchase_Date) as "Month"
            ,Product_ID
            ,Count(*) as "Sales_Amount"
            ,ROW_NUMBER() OVER(PARTITION BY MONTHNAME(Purchase_Date) ORDER BY MONTH(Purchase_Date) DESC) RN
      FROM Product_Sales
      GROUP BY MONTHNAME(Purchase_Date)
              ,Product_ID
      ORDER BY MONTH(Purchase_Date)) X
WHERE RN = 1;
...