2012-08-30 106 views
0

我试图检索已更新产品的列表,该表包含产品的多个更新,因为它记录了价格变化。SQL查询获取最新价格,具体取决于日期

我需要获取所有产品的最新价格更改,但只返回上次更新。到目前为止我有下面的代码,但它只返回最后一次更新,只返回1个产品。

SELECT dbo.twProducts.title, dbo.LowestPrices.productAsin, dbo.twProducts.sku, 
     dbo.LowestPrices.tweAmzPrice, dbo.LowestPrices.price, dbo.LowestPrices.priceDate 
FROM dbo.aboProducts INNER JOIN 
     dbo.LowestPrices ON dbo.aboProducts.asin = dbo.LowestPrices.productAsin 
     INNER JOIN dbo.twProducts ON dbo.aboProducts.sku = dbo.twProducts.sku 
WHERE (dbo.LowestPrices.priceDate = 
     (SELECT MAX(priceDate) AS Expr1 
     FROM dbo.LowestPrices AS LowestPrices_1)) 

我希望这是有道理的,我不知道如果我已经用一种容易理解的方式解释它。

有任何问题请随时询问。

+0

所以LowestPrices表对于每一个价格变化的行? – Zeph

+0

是的,它使我们可以跟踪变化等。 – thatuxguy

回答

0

我想调整你正在寻找的查询加入你的子查询,而不是仅仅在日期匹配。

SELECT dbo.twProducts.title, dbo.LowestPrices.productAsin, dbo.twProducts.sku, 
     dbo.LowestPrices.tweAmzPrice, dbo.LowestPrices.price, dbo.LowestPrices.priceDate 
FROM dbo.aboProducts INNER JOIN 
     dbo.LowestPrices ON dbo.aboProducts.asin = dbo.LowestPrices.productAsin 
     INNER JOIN dbo.twProducts ON dbo.aboProducts.sku = dbo.twProducts.sku 
WHERE dbo.LowestPrices.priceDate IN 
     (SELECT MAX(LowestPrices_1.priceDate) 
     FROM dbo.LowestPrices AS LowestPrices_1 
     WHERE dbo.LowestPrices.productAsin = LowestPrices_1.productAsin) 

这将匹配最大(priceDate)每个产品

+0

完美!工作一种享受。非常感谢 – thatuxguy

1

最简单的办法是使用一个CTEROW_NUMBER功能:

WITH CTE AS 
(
    SELECT dbo.twProducts.title, dbo.LowestPrices.productAsin, dbo.twProducts.sku, 
     dbo.LowestPrices.tweAmzPrice, dbo.LowestPrices.price, dbo.LowestPrices.priceDate, 
     RN = ROW_NUMBER()OVER(PARTITION BY productAsin ORDER BY priceDate DESC) 
    FROM dbo.aboProducts INNER JOIN 
     dbo.LowestPrices ON dbo.aboProducts.asin = dbo.LowestPrices.productAsin 
     INNER JOIN dbo.twProducts ON dbo.aboProducts.sku = dbo.twProducts.sku 
) 
SELECT * FROM CTE WHERE RN = 1