4

ここで機能するSQL Server 2012でクエリを作成しようとしましたが、成功しませんでした。

次のような tblProducts があり、約 100000 行あります。

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

tblPrices は次のようになり、約 100 万行あり、それぞれが特定の時点での商品の価格と在庫を記録します。

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 より大きい必要があります)。また、実行して 810 行を返すのに約 2 分かかり、そのうちの約 4 分の 1 が一意です。

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_NUMBERCTE でPARTITION BY SKU とを使用して、 ORDER BY TimeStamp DESCSKU ごとに 1 行のみを取得でき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

CTEサブクエリに似ており、PARTITION 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 に答える