获得最接近的值低于特定值并分组

时间:2015-01-26 21:23:43

标签: mysql

是否有可能使用没有连接的组函数获得比特定值更接近的值?

date          productId    stock
2014-12-27    1            10
2014-12-31    1            20
2015-01-05    1            30
2014-12-28    2            10
2015-01-04    2            20

该值例如是日期,应低于2015-01-01,但最高日期值和结果应按库存订购,因此结果应为:

date          productId    stock
2014-12-28    2            10
2014-12-31    1            20

当然,这可以通过连接解决,但是大表中的连接速度较慢,不是吗?

1 个答案:

答案 0 :(得分:2)

您正在寻找2014年的最后一天,似乎是每个不同的产品ID。

你用

做到了
             SELECT MAX(date) date, product_id   
               FROM yourtable
              WHERE date < '2015-01-01'
           GROUP BY product_id

这会为您提供date, product_id的集合。 (date, product_id)上的复合索引将使此查询非常有效地进行评估。

然后你join到主表,就像这样。

SELECT a.*
  FROM yourtable AS a
  JOIN (
             SELECT MAX(date) date, product_id   
               FROM yourtable
              WHERE date < '2015-01-01'
           GROUP BY product_id
       ) AS b USING(date,product_id)
ORDER BY a.product_id, a.date

并检索2014年最后一项的详细记录。相同的复合索引将加速JOIN。

你担心加入表现,这是合法的。但是可以通过适当的索引来改进它。确实没有更好的方法。