如何获得去年任何三个月的最高销售数量

时间:2018-08-06 21:18:56

标签: mysql sql

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

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

并想返回结果:最畅销的商品是2月至4月的第一名。

3个月跨度不是四分之一,而是过去1年中的任何3个月跨度。

3 个答案:

答案 0 :(得分:1)

使用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 Fiddle

您可能需要ORDER BY的一些附加条件,因为可能有多个销售最佳商品的期间(因为期间重叠,当然,因为可能有相同数量的商品出售)。现在,只有任何一行的销售数字最高。

答案 1 :(得分:0)

怎么样:

select *
  from (
    select item_id, count(*) as sales
      from my_table
      where sale_date > date_sub(curdate(), interval 3 month)
      group by item_id
    ) x
  order by sales desc
  limit 1;

答案 2 :(得分:-1)

您的问题建议您指定3个月的时间跨度。如果是这样:

select item_id
from t
where sale_date >= '2017-02-01' and sale_date < '2017-05-01'
group by item_id
order by count(*) desc
limit 1;