2016-08-08 22 views
0

Dies ist nicht meine Abfrage, es ist eine Abfrage, dass jemand schrieb, dass ich jetzt arbeite mit.Anomalie in Mysql Abfrage

Ich habe eine Datenbank wie so

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 

(das ist 12 von etwa 200 k Zeilen)

Dies ist meine Abfrage

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 

Es wird Zeilen aus dieser Datenbank Auswahl in 10 Minuten Intervallen. Aber ich habe immer diese Anomalie.

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 

können Sie sehen, dass die diffrence zwischen der ersten Reihe und der zweiten ist 5 Minuten und everythign danach 10 Minuten. Das passiert mit jedem Intervall, das ich versuche.

Zum Beispiel 20 miunte Intervalle

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 

Wie kann ich korrigieren diese Abfrage?

+0

Ich glaube, das ist eine Rundungsgrenze wegen der Genauigkeit in MySQL. Ich habe kein Duplikat, aber ich glaube, ich habe das schon mal hier gesehen. –

+0

Ist das ein Tisch? Sind diese Spalten? Haben diese Spalten Namen? – Strawberry

+0

@Strawberry Aktualisiert für Sie. –

Antwort

1

round Funktion Runde Zahlen grundlegende mathematische Regeln verwenden Sie wahrscheinlich in dem Grunde gelernt:

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

Ergebnisse mit 2009-05-01 00:00:00 und

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

Ergebnisse mit 2009-05-01 00:10:00, so dass Sie immer (auf der mitgelieferten Datensatz) Haben Sie die Hälfte des Intervalls in der ersten Zeile, wenn Sie es weiterhin verwenden.

Betrachten Sie stattdessen ceil oder floor Funktionen.

Als eine Randnotiz machte @Strawberry einen Punkt. Versuchen Sie, etwas wie http://sqlfiddle.com/ zu verwenden, um einige Anstrengungen zu zeigen, mindestens zu fragen.

+0

Cheers krank geben Sie den anderen Funktionen einen Versuch und wenn ich es funktionieren kann, werde ich diese Antwort akzeptieren. Danke für die sql fiddle link, das ist nützlich. Ich habe zur Zeit keine SSH-Berechtigung für den Server, daher konnte ich den Datensatz in der Befehlszeile nicht ausdrucken, um ihn schön auszudrucken. wurde im Texteditor tabelliert und ausgerichtet. –

+0

floor() löste dieses Problem –