2011-07-25 31 views
1

我有一個表code_prices看起來是這樣的:給定一個日期查找在MySQL以前和/或當前和下一個x#日期非線性

CODE | DATE  | PRICE 
ABC | 25-7-2011 | 2.81 
ABC | 23-7-2011 | 2.52 
ABC | 22-7-2011 | 2.53 
ABC | 21-7-2011 | 2.54 
ABC | 20-7-2011 | 2.58 
ABC | 17-7-2011 | 2.42 
ABC | 16-7-2011 | 2.38 

與數據集中的問題是有差距在日期,所以我可能想在18日查找物品ABC的價格,但沒有條目,因爲該物品沒有在這個日期出售。所以我想回到最近的價格的hisotrical條目。

說如果我查詢日期19-7-2011,我想返回17日的條目,然後是下10個可用條目。

但如果我查詢農行20日的價格,我希望回到20日之後,未來10種價格價格...

什麼是去最有效的方法這要麼在SQL語句中,要麼使用存儲過程。

我能想到的只是編寫一個存儲過程,將日期作爲參數,然後查詢所有行,其中DATE> = QUERY-DATE按日期排序,然後選擇11個項目(通過限制)。然後,基本上我需要查看該集合是否包含當前日期,如果它返回,否則我需要返回這11箇中最近的10個條目,並且在表格上執行另一個查詢以通過獲取返回前一個條目日期爲< QUERY-DATE的最大日期。我在想可能有更好的辦法,但是我不是SQL專家(很清楚)...

謝謝!

+0

我是否正確地說日期不被排序 - 它們將按照它們的插入順序返回?或者他們應該按降序排列?你能提供一些預期產出的例子嗎? – Mike

+0

你想查詢一個特定的代碼嗎?或者一個查詢所有代碼? –

回答

2

這是針對一個特定的代碼:

SELECT code, `date`, price 
FROM code_prices 
WHERE code = @inputCode 
    AND `date` >= 
     (SELECT MAX(`date`) 
      FROM code_prices 
      WHERE code = @inputCode 
      AND `date` <= @inputDate 
     ) 
ORDER BY `date` 
LIMIT 11 

對於ABC19-7-2011,上述你會給行17-7-2011和後續10行(20-7-201121-7-2011等)

+0

非常感謝!到底是什麼我! – NightWolf

+0

+1瞭解問題:-) – Mike

2

我並不完全清楚你想達到什麼目的,但我仍然會去。這將搜索包含日期小於或等於您指定日期的行的ID。然後使用該ID返回ID大於或等於該值的所有行。它假定您有一個列可以訂購行的日期列以外的列。這是因爲你說日期是非線性的 - 我假設你必須有其他方式來排序行。

SELECT id, code, dt, price 
    FROM code_prices 
    WHERE id >= (
    SELECT id 
    FROM code_prices 
    WHERE dt <= '2011-07-24' 
ORDER BY dt DESC 
    LIMIT 1) 
ORDER BY id 
    LIMIT 11; 

替代與代碼的條件 - 由於@ypercube爲突出顯示;-)

SELECT id, code, dt, price 
    FROM code_prices 
    WHERE code = 'ABC' 
    AND id >= (
    SELECT id 
    FROM code_prices 
    WHERE dt <= '2011-07-23' 
    AND code = 'ABC' 
ORDER BY dt DESC 
    LIMIT 1) 
ORDER BY id 
    LIMIT 11; 
+0

感謝邁克,好主意,我沒有線性ID字段,所以我不能選擇這個值。 – NightWolf

相關問題