SQL匹配每个匹配的结果

时间:2012-12-17 09:21:15

标签: sql oracle11g

我创建了一个查询,为按创建日期排序的每件商品提供价格。

我现在需要的是每个产品只返回一个行,即每个产品一个价格。

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,但这只会为整个查询提供一个结果。 请注意,这是一个 Oracle数据库,所以据我所知TOP有工作,LIMIT也一样。

我用谷歌搜索它,但我找不到显示这个问题的例子。

我忘了提及:有些价格与同一产品的创建日期相同,因此必须限制只为那些产品提供第一个条目

3 个答案:

答案 0 :(得分: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') 

答案 1 :(得分: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

答案 2 :(得分: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