【问题标题】:Display N most sold items per day每天显示 N 个最畅销的商品
【发布时间】:2021-09-02 05:06:49
【问题描述】:

我不知道如何为此编写(MySQL)查询。我相信对于有经验的人来说这非常简单。

我有一张汇总每天售出物品的表格,例如:

date item quantity
2020-01-15 apple 3
2020-01-15 pear 2
2020-01-15 potato 1
2020-01-14 orange 3
2020-01-14 apple 2
2020-01-14 potato 2
2020-01-13 lemon 5
2020-01-13 kiwi 2
2020-01-13 apple 1

我想查询每天的 N 个最畅销的商品,按日期 DESC 分组,按日期排序,然后按数量 DESC,对于 N = 2,结果如下所示:

date item quantity
2020-01-15 apple 3
2020-01-15 pear 2
2020-01-14 orange 3
2020-01-14 apple 2
2020-01-13 lemon 5
2020-01-13 kiwi 2

请告诉我如何限制每个日期的退货数量。

【问题讨论】:

标签: mysql sql


【解决方案1】:

首先,使用DATE 作为列名并不是一个好主意。

您可以使用@rank := IF(@current = date, @rank + 1, 1) 按日期对行进行编号。此语句每次检查日期是否已更改,是否从零开始计数。

Select date, item, quantity
from
(
     SELECT   item, date, sum(quantity) as quantity,
              @rank := IF(@current = date, @rank + 1, 1) as ranking,  
              @current := date
     FROM     yourtable
     GROUP BY item, date
     order by date, sum(quantity) desc
) t
where t.ranking < 3

【讨论】:

  • @sqlnewbie 。 . . (1) 这可能看起来可行,但 MySQL 特别警告不要分配变量并在不同的表达式中使用它们。 (2) 窗口函数是一个更好的解决方案。如果您没有使用 MySQL 8,那么您的问题应该清楚您正在使用的版本。
【解决方案2】:

如果您使用的是 MySQL 8.0++,则可以这样做

SELECT * FROM 
 (SELECT DATE, ITEM, QUANTITY, ROW_NUMBER() OVER (PARTITION BY DATE ORDER BY QUANTITY DESC) as order_rank FROM TABLE_NAME) as R
WHERE order_rank < 2

【讨论】:

  • 感谢您的宝贵时间,这不是 100% 我想要的。此查询总共返回 N-1 行,但每天只返回 1 行。因此,在 WHERE order_rank
  • 糟糕,我错过了分区。请查看更新的答案。
【解决方案3】:

我认为你可以使用:

select t.*
from t
where (quantity, item) >= (select t2.quantity, t2.item
                           from t t2
                           where t2.date = t.date
                           order by t2.quantity desc, t2.item
                           limit 1 offset 1
                          );

唯一需要注意的是,您需要在当天至少有“n”件物品可用(尽管也可以添加该条件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2017-10-22
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多