如何使用 SQL 从商品列表中按月和日查找平均最便宜的商品?

问题描述 投票:0回答:1

我有一份物品清单,以及每件物品的价格、出售日期、出售日期以及出售地点。我想弄清楚每件商品的平均最便宜价格是多少,以及哪一天和哪一个月最便宜。当然,这些商品在列表中确实有重复项,因为它们在一年中的不同日期和月份在多个地方出售。

Here is an image of the first few lines of the raw data

这是我尝试使用的声明:

SELECT Grocery_Item, Store_Name, MONTH(Sales_Date) AS Month, Sales_Day, Sales_Price
FROM Grocery_Data
WHERE Sales_Price < (SELECT AVG(Sales_Price) FROM Grocery_Data)
ORDER BY Grocery_Item, Sales_Price;

这个想法是尝试构建一个可以获取销售价格的子查询,然后对该价格进行平均并返回低于该销售价格的任何结果。我试图更进一步地定义逻辑,首先使用该函数计算平均销售价格,然后计算最低价格,但我一直遇到错误。我也尝试过这种方法,其想法是找到平均价格,然后构建一个子查询来使用以下方法获取最便宜的价格:

SELECT Grocery_Item, MONTH(Sales_Date) AS Month, Sales_Date,ROUND(AVG(DISTINCT Sales_Price), 2) AS Avg_Sales_Price FROM Grocery_Data GROUP BY Grocery_Item, Month, Sales_Date HAVING AVG(Sales_Price)(SELECT MIN(Avg_Sales_Price) FROM (SELECT Grocery_Item, AVG(Sales_Price) AS Avg_Sales_Price FROM Grocery_Data GROUP BY Grocery_Item) AS Subquery) ORDER BY Avg_Sales_Price;

我没有得到任何结果。

我也尝试过这种方式,但我一直收到错误:

SELECT Store_Name, Grocery_Item, Month, Sales_Day, AVG_Sales_Price
FROM (
    SELECT Store_Name, Grocery_Item, MONTH(Sales_Date) AS Month, Sales_Day,
        ROUND(AVG(Sales_Price), 2) AS AVG_Sales_Price,
        ROW_NUMBER() OVER (PARTITION BY Grocery_Item ORDER BY AVG(Sales_Price)) AS rank
    FROM Grocery_Data
    GROUP BY Grocery_Item, Month, Sales_Day
) ranked_data
WHERE rank = 1;

Here is an image of the first few lines of my results:

图像显示了我使用的结果。它似乎接近我正在寻找的内容,但我仍然需要导出 Excel 才能完成我正在寻找的其余内容。我希望有办法做到这一点而无需导出数据。我也是这方面的初学者,所以任何建议都会有帮助!!

mysql
1个回答
0
投票

所以我确实在 Stack Overflow 之外得到了问题的答案。我不记得向我展示的解决方案,但我明白了逻辑,并且能够自己想出一些接近向我展示的答案的东西。当我第一次尝试这个时,我误解了这个问题,这使我对 SQL 的逻辑失去了意义。但我很高兴能够学到解决方案

enter code here
。所以这里是写给任何有过这样问题的人的!!

SELECT
    g.Grocery_Item,
    EXTRACT(DAY FROM g.Sales_Date) AS Day,
    EXTRACT(MONTH FROM g.Sales_Date) AS Month,
    MIN(g.Sales_Price) AS Min_Price
FROM
    Grocery_Data g
INNER JOIN (
    SELECT
        Grocery_Item,
        MIN(Sales_Price) AS Min_Price
    FROM
        Grocery_Data
    GROUP BY
        Grocery_Item
) min_prices ON g.Grocery_Item = min_prices.Grocery_Item AND g.Sales_Price = min_prices.Min_Price
GROUP BY
    g.Grocery_Item, Day, Month
ORDER BY
    g.Grocery_Item, Month, Day;
© www.soinside.com 2019 - 2024. All rights reserved.