不知道这个问题有多大意义,但希望我能举例说明。

我有一个包含以下各列的表:

PriceHistoryID, PriceChangeDate, DealID, Price


这些是主键,日期,外键和价格。进行此设置的目的是,每次为“交易”更改价格时,都会在此表中创建一个新行。

我想做的是创建一个SELECT,其中为每个唯一的DealID返回1行,而该行是PriceChangeDate是最新的行。

我觉得自己以前做过类似的事情,似乎并不困难,但是我正在空白。谢谢你的帮助!

最佳答案

在MySQL中,您可以使用子查询并加入以下操作:

select d.*
from deals d join
     (select DealId, max(PriceChangeDate) as maxPriceChangeDate
      from deals
      group by DealId
     ) dmax
     on d.DealId = dmax.DealId and
        d.PriceChangeDate = dmax.maxPriceChangeDate;


编辑:

如果在deals(DealId, PriceChangeDate)上具有索引,则可能更有效的一种替代方法是:

select d.*
from deals d
where not exists (select 1
                  from deals d2
                  where d2.DealId = d.DealId and d2.PriceChangeDate > d.PriceChangeDate
                 )


效率来自能够进行索引查找而不是聚合。缺点是查询很难解释(“为每个Dealid选择一个记录,其中PriceChangeDate不大于该记录”)。

10-07 15:58