我们有一个每天运行一次的脚本,通过按日期查找新产品价格来更新相关系统的价格。例如:
ID | product_id | date | price
------------------------------------
1 | 1 | 2014-03-01 | 199
2 | 1 | 2014-04-01 | 299
3 | 2 | 2014-03-11 | 150
4 | 2 | 2014-04-17 | 172
因此,我们的脚本将在4月1日运行,并执行SELECT * FROM table WHERE date='2014-04-01';
,然后使用该product_id列以新价格更新其他系统。一切都很好。我们现在遇到了一个问题,但如果系统没有运行一天,或者用户过去的日期,系统将永远不会使用新的定价进行更新。
所以问题是:在日期< =今天,每个不同的product_id选择max(date)的查询是什么样的?
我尝试了各种不同的方法()和分组,但无法获得我正在寻找的结果。结果是当脚本在4月2日运行时,它会看到最大日期<今天是4月1日,所以抓住这些价格。
答案 0 :(得分:2)
你可能正在寻找这个:
SELECT *
FROM table
WHERE date=(SELECT MAX(date) FROM table WHERE date<='2014-04-01')
或者产品可以有不同的日期:
SELECT t1.*
FROM table t1 INNER JOIN (SELECT product_id, MAX(date) max_date
FROM table
WHERE date<='2014-04-01'
GROUP BY product_id) t2
ON t1.product_id=t2.product_id AND t1.date=t2.max_date
答案 1 :(得分:1)
(也许SELECT * FROM table WHERE date<'2014-04-01' ORDER by date DESC LIMIT 1
必须更换当然的日期,但这会选择此日期之前的最后一个条目。)
编辑:也许这可以提供帮助:Oracle equivalent of Postgres' DISTINCT ON?