Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询帮助:选择最新记录并连接到另一个表_Sql - Fatal编程技术网

SQL查询帮助:选择最新记录并连接到另一个表

SQL查询帮助:选择最新记录并连接到另一个表,sql,Sql,我一直在尝试在SQLServer2012中编写一个在这里工作的查询,但没有成功 我有这样的TBL产品,大约有100000行: SKU, Title, CategoryID 155, 'Product a', 5 176, 'Product b', 5 630, 'Product 1', 10 还有tblPrices,它看起来像这样,大约有一百万行,每行记录某个时间项目的价格和库存: SKU, Price, StockCount, TimeStamp (smalldatetime) 155, 1

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

我有这样的TBL产品,大约有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类SKU的列表,它们的当前价格大于3

到目前为止,我有:

SELECT *
FROM tblPrices
WHERE Timestamp IN (
    SELECT MAX(TimeStamp)
    FROM tblPrices
    GROUP BY SKU
这给了我每个SKU的当前/最新价格(TBL):

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的点),并且执行和返回810行大约需要2分钟,其中约1/4是唯一的:

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

如果有任何帮助,我将不胜感激,因为我自己一事无成。

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
    )
)
您可以在带有
按SKU划分的CTE中使用
按时间戳顺序描述的CTE中使用
类别ID=5的每个SKU仅获得一行:

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

CTE
类似于一个子查询,而
分区依据
类似于
分组依据

与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)

我认为目前的价格应该大于3。可能在某些情况下需要max(时间戳)point@ChetterHummin:啊,这是历史性的。我没听清楚,是的。谢谢您的回复,但我需要的最新价格是>3汉克。在where子句中使用子查询确实可以很好地工作,但由于某些原因,它需要很长时间才能运行(1:18分钟)。这种等待真的有必要吗?另外,内部连接代码返回了重复的SKU-匹配SKU和Price>3Wow的每tblPrices行一个SKU,这将完美地过滤结果,而且速度非常快!我已经实现了voithos的解决方案,但对于我需要的类似查询,这将非常有用。非常感谢您的帮助。@drspa44:记住接受答案(通常是最有帮助的)。顺便说一句,新年快乐:)