我正在尝试为表price
中的每个日期创建一个返回表date
中每个ID的最接近(上面)价格的查询。
date
包含以下日期:
date
2010-11-25
2010-11-24
2010-11-10
price
如下:
id date price
A 2010-11-26 24.99
A 2010-11-24 27.99
A 2010-11-13 22.12
B 2010-11-26 26.51
B 2010-11-24 23.24
B 2010-11-22 27.95
因此对2010-11-25
我应该
id date price
A 2010-11-26 24.99
B 2010-11-26 26.51
代表2010-11-10
id date price
A 2010-11-13 22.12
B 2010-11-22 27.95
代表2010-11-24
id date price
A 2010-11-24 27.99
B 2010-11-24 23.24
等
我相信获得给定日期的结果是可行的(可能是由...组合),但是我正在寻找一个能够在所有日期执行此操作的解决方案。
编辑:
示例中出现错误,已更正......
答案 0 :(得分:2)
我认为你的意思是这个,但你的例子中可能有错误。 (或误解它。)
select
id, date,price
from
(select
p.id,
p.date,
p.price,
dense_rank() over (partition by d.date, p.id order by p.date) as rank
from
date d
inner join price p on p.date > d.date)
where
rank = 1
答案 1 :(得分:0)
SELECT
d.date AS searchDate
p.id
p.date
p.price
FROM
date d
, --- this is a CROSS JOIN
( SELECT DISTINCT id
FROM price
) product
JOIN
price p
ON p.id = product.id
AND p.date =
( SELECT MIN(p2.date)
FROM price AS p2
WHERE p2.date >= d.date
)
答案 2 :(得分:0)
这应该适合你,我想:
select x.date_1 as candidate_date ,
t.*
from ( select d."date" as date_1 ,
p.id ,
min( p."date" ) as date_2
from "date" d
left join price p on p."date" >= d."date"
group by p.id ,
d."date"
) x
left join price t on t.id = x.id
and t."date" = x.date_2
order by 1,2,3
from子句中的虚拟表应该为价格表中的每个“id”提供1行,其日期大于或等于日期表中的候选日期。