我有一个在给定日期出售的商品的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个月跨度。
答案 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;
您可能需要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;