0

作成日順に注文されたすべての製品の価格を示すクエリを作成しました。

私が今必要としているのは、製品ごとに1行だけ、つまり製品ごとに1つの価格を返すことです。

SELECT p.product_id, p.price, p.creation_date
FROM PRICE p
INNER JOIN PRODUCT pr
ON p.product_id = pr.product_id 
AND p.filter_id = 3 
AND (p.store_id IN (1,2,3,4) OR p.price_type = 'A')
ORDER BY p.creation_date DESC

現在、このクエリは、いくつかの一致があるため、製品ごとにいくつかの価格を返しますが、私はそれらの最新のものだけが必要です。ORDER BY p.creation_date DESCは、リストの最初に必要な価格を示します。最初のエントリがその製品の唯一の結果になるようにします。

rownum = 1を試しましたが、クエリ全体で1つの結果しか得られません。これはOracleデータベースであることに注意してください。TOPが機能しないことがわかっている限り、LIMITについても同じことが言えます。

私はそれをグーグルで検索しましたが、この問題を正確に示す例を見つけることができません。

言及するのを忘れました:同じ製品の作成日が同じである価格がいくつかあるので、それらにも最初のエントリのみを与えるという制限が必要です

4

3 に答える 3

2

これを試して、製品の価格表を入手できます

SELECT p.product_id, p.price ,first_value(p.price) over (partition by product_id
                                            order by  p.creation_date desc) new_price, p.creation_date
    FROM PRICE p
    INNER JOIN PRODUCT pr
    ON p.product_id = pr.product_id 
    AND p.filter_id = 3 
    AND (p.store_id IN (1,2,3,4) OR p.price_type = 'A') 
于 2012-12-17T09:28:41.553 に答える
2

row_numer()ウィンドウ関数を使用して、最新の行のみを取得します。

select * from (
  SELECT 
    p.product_id, 
    p.price, 
    row_number() over (partition by product_id order by p.creation_date desc) rn,
    p.creation_date
  FROM PRICE p
  INNER JOIN PRODUCT pr
    ON p.product_id = pr.product_id 
    AND p.filter_id = 3 
    AND (p.store_id IN (1,2,3,4) OR p.price_type = 'A') 
) where rn = 1
于 2012-12-17T10:32:45.947 に答える
1

製品に結合が必要な理由がわかりません。返された行に製品の行を使用していないためです...

あなたは試すかもしれません:

SELECT p.product_id, MAX(p.price),  p.creation_date
FROM PRICE p
INNER JOIN 
   (SELECT pm.product_id, MAX(pm.creation_date)
    FROM PRICE pm
    GROUP BY pm.product_id) most_recent_price
    ON most_recent_price.product_id = p.product_id
WHERE p.filter_id = 3 
AND (p.store_id IN (1,2,3,4) OR p.price_type = 'A')
GROUP BY p.product_id, p.creation_date
于 2012-12-17T09:30:22.787 に答える