4

我一直在尝试在 SQL Server 2012 中编写一个在这里工作的查询,但没有成功。

我有 tblProducts 看起来像这样并且有大约 100000 行:

SKU, Title, CategoryID
155, 'Product a', 5
176, 'Product b', 5
630, 'Product 1', 10

和 tblPrices 看起来像这样,大约有一百万行,每行记录特定时间项目的价格和库存:

SKU, Price, StockCount, TimeStamp (smalldatetime)
155, 10, 5, 2012-12-31 23:40:00
155, 9, 6, 2012-12-30 23:40:00
155, 7, 6, 2012-12-29 21:40:00
176, 0.50, 0, 2012-12-31 23:40:00

基本上,我想获取第 5 类且当前价格 > 3 的 SKU 列表。

到目前为止,我有:

SELECT *
FROM tblPrices
WHERE Timestamp IN (
    SELECT MAX(TimeStamp)
    FROM tblPrices
    GROUP BY SKU

这给了我 tblPrices 中每个 SKU 的当前/最新价格:

SKU, Price, StockCount, TimeStamp
155, 10, 5, 2012-12-31 23:40:00
176, 0.50, 0, 2012-12-31 23:40:00

但我真正需要的是按价格过滤此表,将其加入 tblProducts,然后按类别过滤。但是,无论我如何尝试,它都会为每个 SKU 返回几行或忽略价格条件。下面返回多个 SKU(因此错过了最新价格点必须 > 3),并且还需要大约 2 分钟来执行并返回 810 行,其中大约四分之一是唯一的:

SELECT tblProducts.SKU , CategoryID
FROM tblProducts,

(SELECT EAN, Price
FROM tblPrices
WHERE Timestamp IN (
    SELECT MAX(TimeStamp)
    FROM tblPrices
    GROUP BY SKU
)) a

WHERE tblProducts.EAN = a.EAN AND tblProducts.CategoryID=5 AND a.Price > 3

我将非常感谢任何帮助,因为我自己无处可去。

4

3 回答 3

2

WHERE子句中使用子查询

SELECT SKU
FROM tblProducts
WHERE CategoryId = 5 AND SKU IN (
    SELECT SKU
    FROM tblPrices
    WHERE Price > 3 AND Timestamp IN (
        SELECT MAX(TimeStamp)
        FROM tblPrices
        GROUP BY SKU
    )
)
于 2013-01-01T00:16:53.557 回答
1

您可以ROW_NUMBER在 CTE 中使用PARTITION BY SKUORDER BY TimeStamp DESC为每个 SKU 仅获取一行CATEGORYID=5

WITH CTE AS 
(
   SELECT 
      PR.SKU, PR.Price, PR.StockCount, PR.TimeStamp, P.Title, P.CategoryID,
      ROW_NUMBER() OVER (PARTITION BY PR.SKU ORDER BY PR.TimeStamp DESC) AS RN
   FROM 
      tblProducts P 
      INNER JOIN tblPrices PR ON P.SKU=PR.SKU
   WHERE 
      p.CategoryID=5
      AND PR.Price > 3
)
SELECT 
   SKU, Price, StockCount, TimeStamp, Title, CategoryID
FROM 
   CTE
WHERE 
   RN = 1

TheCTE类似于子查询,而 thePARTITION BY类似于GROUP BY.

于 2013-01-01T01:13:35.603 回答
0

与带有相关子查询的 Voithos 相同的想法。

 SELECT p.SKU, p.Price
 FROM tblPrices p
      Join tblProducts d 
           On d.sku = p.sku
 WHERE d.CategoryId = 5 
     And p.Price > 3
     AND p.Timestamp =
        (Select Max(TimeStamp)
         From tblPrices 
         Where Sku = p.sku)
于 2013-01-01T16:51:14.447 回答