2016-08-08 71 views
0

這不是我的查詢,它是有人寫到我正在處理的查詢。Mysql查詢中的異常

我有一個像這樣

id date    high  low   open  close  open_id  close_id 

1 2009-05-01 00:00:00 0.729125 0.729225 0.72889  0.72889  1   74 
2 2009-05-01 00:01:00 0.72888  0.728895 0.72883  0.72887  75   98 
3 2009-05-01 00:02:00 0.728865 0.72889  0.72881  0.72888  99   121 
4 2009-05-01 00:03:00 0.72891  0.72901  0.72891  0.729  122   141 
5 2009-05-01 00:04:00 0.728975 0.729115 0.728745 0.72878  142   225 
6 2009-05-01 00:05:00 0.728785 0.72882  0.72867  0.72882  226   271 
7 2009-05-01 00:06:00 0.72884  0.72887  0.728735 0.728785 272   293 
8 2009-05-01 00:07:00 0.728775 0.728835 0.72871  0.728835 294   317 
9 2009-05-01 00:08:00 0.728825 0.72899  0.728795 0.72897  318   338 
10 2009-05-01 00:09:00 0.72898  0.729255 0.72898  0.72922  339   383 
11 2009-05-01 00:10:00 0.72922  0.729325 0.72908  0.729105 384   437 
12 2009-05-01 00:11:00 0.729115 0.72918  0.728635 0.72905  438   553 

數據庫(這是12出來的約20萬行)

這是我的查詢

SELECT x.date, t.high, t.low, t.open, t.close, x.open_id, x.close_id from (SELECT MIN(`date`) as `date`, MAX(`close_id`) as `close_id`, MIN(`open_id`) as `open_id` 
FROM `AUDNZD_minutes` 
WHERE `date` >= '2011-03-07 00:00:00' and `date` < '2011-03-11 12:00:00' 
GROUP BY round(UNIX_TIMESTAMP(date)/600) order by `date`) as x inner join `AUDNZD_minutes` as t on x.close_id = t.close_id 

它是從數據庫中選擇行間隔10分鐘。不過,我總是有這種異常。

2011-03-07 00:00:00 1.3761  1.375595 1.375815 1.37589  55180489 55181083 
2011-03-07 00:05:00 1.376055 1.37568  1.375925 1.37594  55181084 55181751 
2011-03-07 00:15:00 1.37609  1.375835 1.375835 1.37606  55181752 55182003 
2011-03-07 00:25:00 1.37578  1.37526  1.375505 1.375555 55182004 55182615 
2011-03-07 00:35:00 1.374645 1.374455 1.374535 1.374645 55182616 55183178 
2011-03-07 00:45:00 1.37463  1.373775 1.374085 1.374025 55183179 55183820 

你可以看到,第一行和第二之間之探源爲5分鐘,everythign在這之後是10分鐘。這發生在我嘗試的任何間隔。

例如,20 miunte間隔

2011-03-07 00:00:00 1.376155 1.375915 1.37594  1.376025 55180489 55181434 
2011-03-07 00:10:00 1.376105 1.37592  1.37593  1.376085 55181435 55182273 
2011-03-07 00:30:00 1.374025 1.37388  1.373965 1.37401  55182274 55183429 
2011-03-07 00:50:00 1.373895 1.373595 1.37365  1.373595 55183430 55184894 
2011-03-07 01:10:00 1.37382  1.373505 1.37373  1.373715 55184895 55185885 
2011-03-07 01:30:00 1.373305 1.373025 1.373265 1.373055 55185886 55187306 

我怎麼能解決這個查詢?利用基本的數學規則

+0

我相信這是一個舍入限制,因爲MySQL的精度。不要有重複,但我相信在這之前我已經看到了這一點。 –

+0

這是一張桌子嗎?那些專欄?那些專欄有名字嗎? – Strawberry

+0

@Strawberry爲您更新。 –

回答

1

round功能回合數,你可能學到小學:

select FROM_UNIXTIME(round(UNIX_TIMESTAMP('2009-05-01 00:04:00')/600) *600) from dual; 

結果與2009-05-01 00:00:00

select FROM_UNIXTIME(round(UNIX_TIMESTAMP('2009-05-01 00:06:00')/600) *600) from dual; 

結果與2009-05-01 00:10:00,所以你將永遠(所提供的數據集)如果您繼續使用它,請在第一行中放置一半的時間間隔。

請考慮ceilfloor函數。

作爲一個方面說明,@Strawberry提出了一個觀點。嘗試使用像http://sqlfiddle.com/這樣的東西來展示一些至少在提問中的努力。

+0

乾杯生病嘗試其他功能,如果我可以讓它工作不正常接受這個答案。感謝您的SQL小提琴鏈接,這很有用。我目前沒有對服務器的ssh權限,因此無法打印出命令行中的數據集以便將其打印出來。在文本編輯器中使用Tab鍵和對齊方式。 –

+0

floor()解決了這個問題 –