2011-08-24 74 views
2

我試圖創建一個查詢,以便爲表date中的每個日期返回表price中每個ID的每個id的最接近(上面)的價格。Oracle:有效地獲取每個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 

我相信得到的結果給定日期是可行的(也許GROUP BY ...有),但我要尋找一個解決方案,這是所有的日期。

編輯:

有在本例中的錯誤,糾正......

+0

我真的看不到那些'B'記錄中的邏輯。你爲什麼要在'2010年10月25日'得到'2010-11-26'? – GolezTrol

+0

@Golez因爲這是ID' B'(我在這裏猜測)的最近日期 – NullUserException

+0

我會這麼認爲,如果我讀了解釋,但2010-11-22似乎更接近我。 – GolezTrol

回答

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 
+0

我認爲你正在產生更多的行比應該是 – NullUserException

+0

我認爲這可能是由'd.date命令'應該是'通過p.date命令'。修正了這個儘管我承認我沒有Oracle,Notepad是一個糟糕的查詢測試器。 :) – GolezTrol

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 
     ) 
+0

這給了我一個語法錯誤 – NullUserException

+0

@NullUserException:你可以嘗試用'逗號'替換'CROSS JOIN','? –

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子句中的虛擬表應該給你1列在價格表中的每個「ID」與日期大於或等於日期表中的候選日期。

+0

我認爲你也會產生比應該有的更多的行 – NullUserException

+0

按照正確的標準進行分組非常重要。 –