Mysql 如何在去年的任何3个月内获得最高的销售额

Mysql 如何在去年的任何3个月内获得最高的销售额,mysql,sql,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月期间最畅销的商品为1件 3个月的跨度不是一个季度,而是过去1年中的任何3个月跨度 那么: select * fro

对于在给定日期出售的物品,我有一个简化的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个月跨度

那么:

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;
使用date_add计算可能的三个月期间的开始和结束时间。加入他们,使销售日期处于该期间。然后根据项目ID、周期的开始和结束进行分组。按计数*降序排列结果,使最畅销的商品位于顶部。使用限制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;

您可能需要为ORDER BY设置一些附加条件,因为可以有多个期间销售最畅销的商品,因为这些期间重叠,当然也可能有以相同编号销售的商品。现在,任何一行顶部都有最大销售额。

您的问题表明您正在指定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;

你的mysql版本是什么?如果是mysql 8.0,你可以使用CTEs,这会让生活更轻松。为什么要使用超级查询?@Strawbery,因为我没有简化它。我想我倾向于看到查询的大节点,但没有意识到在这种情况下,它可以被减少。