2012-09-06 13 views
5

我擁有40年以上的成千上萬個價位。我想構建一個只返回3000個總數據點的查詢,其中最後的500個數據點是最近的數據點,其他2500個數據只是其餘數據的一個樣本,均勻分佈。使用MySQL選擇隨時間變化的大量數據部分

是否有可能在一個查詢中做到這一點?我將如何選擇大量數據的樣本?這是什麼我的意思是想起來了一個其他的2500個數據點的樣本一個小例子:

1 
2 
3  
4 
5 
6 
7 
8 
9 
10 

我想回到這樣的事情:

1 
5 
10 

這裏的最後查詢500:

SELECT * FROM price ORDER BY time_for DESC LIMIT 500 

我不知道如何去從其他數據點獲取樣本數據。

+0

可以顯示錶格的設計嗎?你有多少條記錄? – Nin

回答

5

試試這個:

(SELECT * FROM price ORDER BY time_for DESC LIMIT 500) 
UNION ALL 
(SELECT * FROM price WHERE time_for < (SELECT time_for FROM price ORDER BY time_for LIMIT 500, 1) ORDER BY rand() LIMIT 2500) 
ORDER BY time_for 

注:它可能會很慢。這張桌子有多大?

從所有這些行中只獲取主ID可能會更快,然後在縮小後將其添加到輔助查詢中的原始ID。這是因爲ORDER BY rand() LIMIT必須整理整個表。如果表很大,這可能需要很長的時間,並且需要大量的磁盤空間。僅檢索ID可減少必需的磁盤空間。

3

以前的答案很好,但你確實指定了你想要的結果是均勻分佈所以我也會添加這個可能性。通過在行上迭代計數器,您可以使用MOD運算符對均勻分佈進行採樣。我現在沒有安裝MYSQL來測試這個,所以如果語法不是100%的話,我們會很抱歉。但它應該足夠接近,並可能給你一些想法。

( SELECT p1.* 
     FROM price p1 
    ORDER BY p1.time_for DESC 
     LIMIT 500 ) 

    UNION ALL 

    ( SELECT @i := @i + 1 AS row_num, 
      p2.* 
     FROM price p2, 
      (SELECT @i: = 0) 
     WHERE row_num > 500 
     AND (row_num % 500) = 0 
    ORDER BY time_for DESC ) 

第一個查詢給出500個最新的行。第二個查詢在此之後每排第500行,從而返回其餘數據的均勻分佈。顯然你可以調整這個參數來達到想要的樣本間距。或者將其基於表中的總行數來計算必要的間距以準確地給出2500條記錄。