mysql - 如何在去年的任何 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 个月跨度。
解决方案
用于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
因为最畅销的商品可能有多个时期(因为时期重叠,当然因为可能存在以相同数量出售的商品)。现在,任何一行的最高销售额都在上面。
推荐阅读
- javascript - 如何构建用于动态查找值的 JSON 键
- flutter - 显示“类名实例”而不是数据
- swift - 我应该将 UI 相关移动到单独类中的扩展中吗?
- excel - Máximo número de palabras, elegidas de los archivos de unacarpa
- python - python - 如何在python中使用numpy将文件中的数据加载为数组?
- javascript - 自动完成不更新选项,但新数组在 hits 属性中可用
- sql - 通过文本数组中的任何值在文本数组中搜索 Postgres sql
- refactoring - 为什么我不能将部分框定义移动到本地绑定中?
- android - 图像和视频的 getItemViewType
- oracle - 我需要为备用或仅安装 oracle 软件安装 oracle 数据库吗?