我有两个表,一个存储当前价格,另一个存储物品的历史价格。我想创建一个查询来提取当前价格,以及当前价格和最近历史价格之间的差异。
在历史表中,我有价格的开始和结束时间,所以我可以选择最近的价格,但如何在一个查询中将它们全部拉到一起?或者我必须做一个子查询?
select p.current_price,
h.historical_price
h.historical_time
from price p
inner join price_history h
on p.id = h.id
where max(h.historical_time)
这显然不起作用,但这正是我想要完成的。
这给了我当前和历史价格。但我想确保我有最近的价格。我该怎么做?
答案 0 :(得分:2)
我会这样做。请注意,如果id
中有两个具有相同price_history
日期的价格条目,则您可能会获得重复记录:
select p.current_price, h.historical_price,
p.current_price - h.historical_price as PriceDeff, h.historical_time
from price p
inner join (
select id, max(historical_time) as MaxHistoricalTime
from price_history
group by id
) hm on p.id = hm.id
inner join price_history h on hm.id = h.id
and hm.MaxHistoricalTime = h.historical_time
答案 1 :(得分:1)
我不相信没有一个没有更糟糕的子查询的方法。另一方面,如果表的索引正确,则返回聚合函数结果的子查询通常非常快。
答案 2 :(得分:0)
select
p.current_price,
h3.historical_price,
h3.historical_time
from
price p,
( select h1.id, max( h1.historical_time ) as MaxHT
from price_history h1
group by 1 ) h2,
price_history h3
where
p.id = h2.id
and p.id = h3.id
and h2.MaxHT = h3.historical_time