首页 > 解决方案 > 如何在去年的任何 3 个月内获得最高的销售额

问题描述

我有一个在给定日期出售的商品的 SQL 表(针对这个问题进行了简化),如下所示:

item_id    sale_date
-------    ---------
  1        2017-01-01
  2        2017-01-14
  1        2017-02-02
  3        2017-03-03
 ...          ...

并希望返回结果:2 月至 4 月期间最畅销的商品是 #1。

3 个月跨度不是一个季度,只是过去 1 年中的任何 3 个月跨度。

标签: mysqlsql

解决方案


用于date_add()计算可能的三个月期间的开始和结束。加入他们,以便sale_date在期间。然后按项目 ID、期间的开始和结束进行分组。按降序排列结果,count(*)将最畅销的商品排在最前面。用于LIMIT 1仅获取第一条记录。

SELECT t.item_id,
       p.b,
       p.e
       FROM elbat t
            INNER JOIN (SELECT DISTINCT
                               date_add(sale_date, INTERVAL -day(sale_date) + 1 DAY) b,
                               date_add(date_add(sale_date, INTERVAL -day(sale_date) + 1 DAY), INTERVAL 3 MONTH) e
                               FROM elbat
                        UNION
                        SELECT DISTINCT
                               date_add(date_add(sale_date, INTERVAL -day(sale_date) + 1 DAY), INTERVAL -3 MONTH) b,
                               date_add(sale_date, INTERVAL -day(sale_date) + 1 DAY) e
                               FROM elbat) p
                        ON p.b <= t.sale_date
                           AND p.e > t.sale_date
       GROUP BY t.item_id,
                p.b,
                p.e
       ORDER BY count(*) DESC;

SQL小提琴

您可能需要一些额外的标准,ORDER BY因为最畅销的商品可能有多个时期(因为时期重叠,当然因为可能存在以相同数量出售的商品)。现在,任何一行的最高销售额都在上面。


推荐阅读