2017-11-16 4 views
0

Ich habe eine Abfrage in r, mit rmysql Paket:Rmysql-Abfrage gibt nicht die richtigen Werte zurück?

sql.query = paste0("SELECT * FROM performance_db.pcTab WHERE 
         fk_ID_calc = (SELECT ID_calc FROM performance_db.calculationTab WHERE 
         turbine_model = '",input$t1,"' AND 
         op_mode = '",input$t2,"' AND 
         date_entered ='",input$t3,"') 
         AND sensor = 'P_el'" 
) 
    spc = fetch(dbSendQuery(conn, sql.query), n = -1) 

dies eine Tabelle zurück:

sql.query = paste0("SELECT * FROM performance_db.pcTab WHERE 
         fk_ID_calc = (SELECT ID_calc FROM performance_db.calculationTab WHERE 
         turbine_model = '",input$t1,"' AND 
         op_mode = '",input$t2,"' AND 
         date_entered ='",input$t3,"') 
         AND sensor = 'P_el' AND Air_density = 1" 
) 

:

head(spc) 
    ID_pc voltage_side sensor Air_density v2.5 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 
1  1   0 P_el  1.225 0 44 184 404 721 1165 1686 2107 2272 2300 2300 2300 2300 2300 2300 2300 2300 2300 
2  2   0 P_el  1.000 NA 33 155 346 622 1010 1486 1967 2224 2286 2294 2300 2300 2300 2300 2300 2300 2300 
3  3   0 P_el  1.030 NA 35 161 358 642 1041 1529 1999 2235 2291 2297 2300 2300 2300 2300 2300 2300 2300 
4  4   0 P_el  1.060 NA 37 167 369 661 1072 1571 2036 2249 2295 2300 2300 2300 2300 2300 2300 2300 2300 
5  5   0 P_el  1.090 NA 39 173 381 681 1103 1612 2060 2256 2300 2300 2300 2300 2300 2300 2300 2300 2300 
6  6   0 P_el  1.120 NA 42 178 392 701 1134 1649 2080 2263 2300 2300 2300 2300 2300 2300 2300 2300 2300 

Ich mag würde wie auf Air_density zusätzliche Filter hinzufügen Dies ist die Rückgabe nur einer Zeile enthält die Information für Air_density = 1:

ID_pc voltage_side sensor Air_density v2.5 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 
1  2   0 P_el   1 NA 33 155 346 622 1010 1486 1967 2224 2286 2294 2300 2300 2300 2300 2300 2300 2300 

Aber wenn ich versuche, Basis auf anderen Air_densities zu filtern, gibt es nichts zurück. Wie, wenn die oben erwähnte Abfrage habe ich AND Air_density = 1.225:

head(spc) 
[1] ID_pc  voltage_side sensor  Air_density v2.5   v3   v4   v5   v6   
[10] v7   v8   v9   v10   v11   v12   v13   v14   v15   
[19] v16   v17   v18   v19 

habe ich keine Ahnung, warum es passiert ist !!!

+2

Warum Sie vergleichen (scheinbaren) auf String-Werte Dezimalstellen? – HoneyBadger

+0

Ja, Sie sollten "AND Air_density = 1.225" schreiben, wie HoneyBadger sagte. –

+0

@HoneyBadger, Es ändert nichts, wenn ich mag: 'AND Air_density = 1.225', es gibt die gleichen Werte zurück – Ali

Antwort

1

FLOAT und DOUBLE Datentypen sind nicht präzise. Wenn Sie den Wert 1.225 speichern, kann er unter 1.22500001 gespeichert werden. Und wenn Sie versuchen, alle Daten mit dem Wert 1.225 abzufragen, wird es nicht finden, weil es als 1.22500001 gespeichert wird.

Sie sollten besser verwenden Datentypen DECIMAL oder NUMERIC oder versuchen, CAST die FLOAT Werte als DECIMAL wie folgt aus:

CAST(Air_density as DECIMAL(10,3)) 

Das von der Dokumentation von MySQL ist:

11.2.3 Schwimmdock -Punkttypen (ungefährer Wert) - FLOAT, DOUBLE

Die FLOA T- und DOUBLE-Typen repräsentieren ungefähre numerische Datenwerte. MySQL verwendet vier Bytes für Werte mit einfacher Genauigkeit und acht Bytes für Werte mit doppelter Genauigkeit.

Für FLOAT erlaubt der SQL-Standard eine optionale Angabe der Genauigkeit (aber nicht der Bereich des Exponenten) in Bits nach dem Schlüsselwort FLOAT in Klammern. MySQL unterstützt auch diese optionale Genauigkeitsspezifikation, aber der Genauigkeitswert wird nur verwendet, um die Speichergröße zu bestimmen . Eine Genauigkeit von 0 bis 23 ergibt eine 4-Byte FLOAT-Säule mit einfacher Genauigkeit. Eine Genauigkeit von 24 bis 53 resultiert in einer 8-Byte Double-Precision DOUBLE-Spalte.

MySQL erlaubt eine nicht standardmäßige Syntax: FLOAT (M, D) oder REAL (M, D) oder DOUBLE PRECISION (M, D). Hier bedeutet (M, D), dass Werte mit bis zu M Ziffern insgesamt gespeichert werden können, von denen D Ziffern nach dem Komma liegen können. Zum Beispiel wird eine als FLOAT (7,4) definierte Spalte bei der Anzeige wie -999.9999 aussehen. MySQL führt beim Speichern von Werten eine Rundung durch. Wenn Sie also 999.00009 in eine FLOAT (7,4) -Spalte einfügen, lautet das ungefähre Ergebnis 999.0001.

Da Gleitkommawerte Näherungswerte sind und nicht als exakte Werte gespeichert werden, können Versuche, sie als exakt in Vergleichen zu behandeln, zu Problemen führen. Sie unterliegen auch der Plattform oder Implementierung Abhängigkeiten. Weitere Informationen finden Sie in Abschnitt B.5.4.8, „Probleme mit Floating-Point-Values“

Für maximale Portabilität, Code erfordern Speicherung von angenäherten numerischen Datenwerte sollten FLOAT oder DOUBLE PRECISION ohne Angabe Präzision verwenden oder Anzahl der Ziffern.

https://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html

Dieser Link sollte auch helfen:

https://dev.mysql.com/doc/refman/5.7/en/problems-with-float.html

Verwandte Themen