每天显示 N 个最畅销的商品

Posted

技术标签:

【中文标题】每天显示 N 个最畅销的商品【英文标题】:Display N most sold items per day 【发布时间】: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

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

【问题讨论】:

亲爱的@sqlnewbie,你试过什么了吗? 你可以在这里找到答案***.com/questions/2129693/… 【参考方案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”件物品可用(尽管也可以添加该条件)。

【讨论】:

以上是关于每天显示 N 个最畅销的商品的主要内容,如果未能解决你的问题,请参考以下文章

你的业务是怎么演变为微服务的

用Python爬取分析某东618畅销商品销量数据,带你看看大家都喜欢买什么!

并查集的一般操作 ④

supermarket

c语言 商品管理系统

湖仓一体电商项目(二十三):离线业务 统计每天用户商品浏览所获积分