代码之家  ›  专栏  ›  技术社区  ›  Scott Saunders

在给定日期时间之前获取两个最新记录的MySQL查询

  •  1
  • Scott Saunders  · 技术社区  · 15 年前

    我有一个跟踪各种产品价格的应用程序。任何给定产品的价格在任何一天的任何时候都可能发生变化,并且不会定期变化。有一个PriceHistory表,记录了随着时间推移产品的所有价格。应用程序的用户可以选择时间和日期,并查看当时的价格。我使用类似这样的查询来获取任何给定日期和时间的所有产品的“当前”价格:

    SELECT A.*
    FROM `PriceHistory` A
    INNER JOIN (
        SELECT `BrandKey`, `LocationKey`, `ProductKey`, max(`EffectiveDateTime`) AS MaxUpdateDate
        FROM `PriceHistory`
        WHERE `EffectiveDateTime` <= '2010-02-22 12:00:00'
        GROUP BY `BrandKey`, `LocationKey`, `ProductKey`
    ) AS B ON 
    A.`BrandKey` = B.`BrandKey`
    AND A.`LocationKey` = B.`LocationKey`
    AND A.`ProductKey` = B.`ProductKey`
    AND A.`EffectiveDateTime` = B.MaxUpdateDate
    

    现在,我需要能够向用户展示当这个价格生效时,价格变化了多少。所以我需要得到两个最新的价格为选定的时间,而不是一个。我受够了。我尝试过一些方法,但我只是遇到了SQL错误,因为我尝试的联接不合法。任何帮助都将不胜感激。

    我可以循环浏览所有的产品并获得两个最新的价格,但对于350个产品和75000个价格行,这需要大约10秒钟的时间。我不一定需要在一个查询中包含所有产品,但是为每个产品运行查询的速度不够快。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Zak    15 年前

    EffectiveDateTime

        2
  •  1
  •   Martin    15 年前

    v1,v2,v3,1
    v1,v2,v3,2
    v1,v2,v4,1
    ...
    

    create temporary table ph ( 
        `BrandKey` varchar(10),
        `LocationKey` varchar(10), 
        `ProductKey` varchar(10), 
        `EffectiveDateTime`datetime,
        rank int not null auto_increment,
        primary key(BrandKey, LocationKey, ProductKey, rank);
    
    insert into ph
       select `BrandKey`, `LocationKey`, `ProductKey`, `EffectiveDateTime`, NULL
       FROM `PriceHistory`
       WHERE `EffectiveDateTime` <= '2010-02-22 12:00:00'
       order by EffectiveDateTime desc;
    
    delete from ph where rank > 2;
    

    BrandKey LocationKey ProductKey

        3
  •  0
  •   Dancrumb    15 年前

    EffectiveDateTime DESC LIMIT 2

    SELECT A.*
    FROM `PriceHistory` A
    WHERE <clauses for selecting a product and brand go here>
    ORDER BY `EffectiveDateTime` DESC
    LIMIT 2