我创建了一个查询,为按创建日期排序的每件商品提供价格。
我现在需要的是每个产品只返回一个行,即每个产品一个价格。
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也一样。
我用谷歌搜索它,但我找不到显示这个问题的例子。
我忘了提及:有些价格与同一产品的创建日期相同,因此必须限制只为那些产品提供第一个条目
答案 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