Oracle:有效地获取每个id的最接近日期

时间:2011-08-24 21:05:12

标签: sql oracle

我正在尝试为表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

我相信获得给定日期的结果是可行的(可能是由...组合),但是我正在寻找一个能够在所有日期执行此操作的解决方案。

编辑:

示例中出现错误,已更正......

3 个答案:

答案 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行,其日期大于或等于日期表中的候选日期。