mysql - 根据时间间隔使用 MAX(price) 或 MAX(date) 对产品进行分组

标签 mysql date group-by max min

我已经搜索了 2 天的答案,但仍然一无所获。请帮帮我。

我有一个包含产品、产品价格和价格登记日期的数据库:

product_id | price | date
-------------------------
    1      | 8.95  | 2012-12-01
    2      | 3.40  | 2012-12-01
    1      | 9.05  | 2012-12-19
    3      | 2.34  | 2012-12-24
    3      | 2.15  | 2012-12-01
    1      | 8.80  | 2012-12-19
    1      | 8.99  | 2012-12-02
    2      | 3.45  | 2012-12-02

请注意,同一种产品在同一天可能有不同的价格值(第 3 行和第 6 行)。这是因为单一产品有很多供应商。数据库上也有一个供应商列,但我发现它与解决方案无关。如果我错了,您可以将其添加到解决方案中。

基本上我想要的是编写一个返回两组组合数据的查询,如下所示:

  • 第一套是根据上个月插入的产品的最低价格制作的。由于今天是 15 日 1 月,查询应读取第 3、4 和 6 行,应用最低价格,并仅返回第 4 和第 6 行,两者都是该产品上个月的最低价格。
  • 第二套是最后插入的产品,上个月没有登记价格。即,对于第一组中未显示的产品,查询应搜索最后插入的产品。

我希望这是清楚的。如果不是,请再问我。

这个数据库的查询结果应该是:

product_id | price | date
-------------------------
    1      | 8.80  | 2012-12-19 <-Min price for product 1 on last month
    3      | 2.34  | 2012-12-24 <-Min price for product 3 on last month
    2      | 3.45  | 2012-12-02 <-No reg for product 2 on last month, show last reg.

我已经尝试了所有方法:UNION, (DATE_SUB(CURDATE(), INTERVAL 1 MONTH), MIN(price), MAX(date) etc.等等。没有任何效果。我现在不知道在哪里搜索,请帮助我。

最佳答案

(SELECT product_id, MIN(price), date
FROM products
WHERE date + INTERVAL 1 MONTH > NOW()
GROUP BY product_id)
UNION
(SELECT product_id, price, MAX(date)
FROM products
WHERE product_id NOT IN (SELECT product_id
    FROM products
    WHERE date + INTERVAL 1 MONTH > NOW()
    GROUP BY product_id)
GROUP BY product_id)

这应该可行,但我不确定这是最优化的方法。

关于mysql - 根据时间间隔使用 MAX(price) 或 MAX(date) 对产品进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14339535/

相关文章:

php - 使用重复键插入

mysql - 在 Kubernetes 上创建 mysql 容器时如何初始化?

c# - 转换 c# .Net 中的写入日期

mysql - 按列分组后获取mysql中最大的年份值

php - 无法编辑数据库中的数据并且无法获取带有 ID 的名称?

javascript - 在 Sequelize Hooks 中使用 Promise

bash - 以秒为单位获取 UTC 时间

java - 使用扫描仪和 useDelimiter/右正则表达式解析文本

ruby - 续集:如何使用分组和计数

python - 获取 pandas DataFrame 中每个组的前 N ​​个最大行