Laden...

Histogramdaten über SQL. Problem bei Fließkommawerten

Erstellt von Toxo vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.445 Views
Thema geschlossen
T
Toxo Themenstarter:in
64 Beiträge seit 2011
vor 12 Jahren
Histogramdaten über SQL. Problem bei Fließkommawerten

verwendetes Datenbanksystem: MSS SQL 2008

Hallo,

Ich habe mir eine Abfrage gebastelt, welche mir Messdaten so auffbereitet, dass sie in einer Form zurückkommen die als Histogramm auswertbar sind.

Beispielabfrage:


SELECT 
((Sin/5)*5) AS untereGrenze, 
((Sin/5+1)*5) AS obereGrenze, 
Count(Sin) AS Daten 
FROM PE 
GROUP BY (( Sin/5)*5) , ((Sin/5+1)*5)   
HAVING  ((Sin/5)*5)>0 AND  ((Sin/5+1)*5)<5000

Ergebniss bei ganzzahligen Werten sind als Bild angehängt.

Das eigentliche Problem tritt nun bei Fließkommazahlen auf. Wird im nächsten Post genauer erläutert, da nur 1 Bild pro Post gestatttet ist.

T
Toxo Themenstarter:in
64 Beiträge seit 2011
vor 12 Jahren

Beispielabfrage über eine Tabelle mit Fließkommawerten:


SELECT
 ((IOut/0.2)*0.2) AS untereGrenze, 
((IOut/0.2+1)*0.2) AS obereGrenze,
 Count(IOut) AS Daten
 FROM PE 
GROUP BY (( IOut/0.2)*0.2) , ((IOut/0.2+1)*0.2)  
 HAVING  ((IOut/0.2)*0.2)>20 AND  ((IOut/0.2+1)*0.2)<80

hier wird zwar in 0,2 Abständen Gruppiert doch die Schrittweite ist sehr variabel.

Als Anhang ein Ausschnitt des Ergebnisses

Hat evtl. jemand eine Idee wo der Fehler liegen könnte? Ich drehe mich nur im Kreis und bräuchte ein paar Anregungen wo dei Fehlerquelle liegen könnte.

Danke und Gruß
David

5.658 Beiträge seit 2006
vor 12 Jahren

Hi Toxo,

Das eigentliche Problem tritt nun bei Fließkommazahlen auf. Wird im nächsten Post genauer erläutert, da nur 1 Bild pro Post gestatttet ist.

Hat evtl. jemand eine Idee wo der Fehler liegen könnte?

Wenn du jetzt auch noch dein Problem erklären würdest, könnte dir evtl. jemand weiterhelfen...

Christian

Weeks of programming can save you hours of planning

T
574 Beiträge seit 2008
vor 12 Jahren

Ich versteh noch nicht ganz das Problem. Meinst du die Sprünge in der ersten Spalte also z.B. 40.0, 40.1, 40.7? Diese Sprünge hast du in der anderen Tabelle auch, das liegt aber wohl einfach daran, dass du im Bereich 40.2 bis 40.6 keine Daten hast.

Schon mal überprüft?

Edit: ich bin mir auch nicht ganz sicher, ob dein Statement überhaupt einen Sinn hat. Im Endeffekt lieferst du nur die Anzahl jeder Ausprägung von IOut, wobei die Ausprägung die erste Spalte darstellt und die 2. spalte nur die erste spalte + 0.2 ist. Im Grunde kannst du eigentlich auch die ganze Rumrechnerei weglassen, weil du ja sowieso nur IOut und IOut + 0.2, und die dazugehörige Anzahl lieferst.

T
Toxo Themenstarter:in
64 Beiträge seit 2011
vor 12 Jahren

Hi Toxo,

Das eigentliche Problem tritt nun bei Fließkommazahlen auf. Wird im nächsten Post genauer erläutert, da nur 1 Bild pro Post gestatttet ist.

Hat evtl. jemand eine Idee wo der Fehler liegen könnte?

Wenn du jetzt auch noch dein Problem erklären würdest, könnte dir evtl. jemand weiterhelfen...

Christian

ja irgendwie hab ich das vergessen. Verzeihung.

im 2. Post ist eine Schrittweite für das Histogramm von 0,2 angegeben.

Ich erwarte also nur alle Vielfache von 0,2 einen Wert. In der Datatable tauchen aber Werte 36,5, 36,6, 36,7, 36,8......
erwarten tue ich aber 36,4, 36,6, 36,8, 37....

Die Abstände zwischen obergrenze und untergrenze sind Korrekt mit 0,2 nur die Schrittweite ist eifnach nicht Korrekt.
wenn ich nun eine Schrittweite von 1 angebe sieht es zum Beispiel so aus

untereGrenze | obereGrenze| Anzahl gefundener Datensätze

34,8 | 35,8 | 38
35,4 | 36,4 | 18
35,7 | 36,7 | 3
36 | 37 | 12

usw...

erwünschte ausgabe wär:

34| 35 | 20
35 | 36 | 24
36 | 37 | 18

usw.

Ich hoffe es ist nun etwas klarer wo das Problem liegt.

Ich versteh noch nicht ganz das Problem. Meinst du die Sprünge in der ersten Spalte also z.B. 40.0, 40.1, 40.7? Diese Sprünge hast du in der anderen Tabelle auch, das liegt aber wohl einfach daran, dass du im Bereich 40.2 bis 40.6 keine Daten hast.

Schon mal überprüft?

Edit: ich bin mir auch nicht ganz sicher, ob dein Statement überhaupt einen Sinn hat. Im Endeffekt lieferst du nur die Anzahl jeder Ausprägung von IOut, wobei die Ausprägung die erste Spalte darstellt und die 2. spalte nur die erste spalte + 0.2 ist. Im Grunde kannst du eigentlich auch die ganze Rumrechnerei weglassen, weil du ja sowieso nur IOut und IOut + 0.2, und die dazugehörige Anzahl lieferst.

Die Sprünge machen kein Problem da die Datatable so wie sie ist an ein Diagramm übergeben wird und es nur um das finden de Gausskurve geht.
die unregelmäßge Schrittweite bei double Werten zerstückelt mir aber meine Gausskurve und ist so nicht zur Auswertung geeignet.

Die Rechnerei ist notwendig damit ich Werte in Bereiche gruppieren kann die eben durch meine Schrittweite angegeben wird. Diese ist im 1. Fall 5 und im 2. fall 0,2

T
574 Beiträge seit 2008
vor 12 Jahren

Ich sag mal da musst du etwas mehr investieren. du kannst aus den Daten 1,3,3,3,5,5 nicht die Zeilen 1,2,3,4,5 erzeugen. Dazu müsstest du dir erst eine (temporäre?) Tabelle mit der richtigen Schrittweite erzeugen und dann deine Daten per LEFT JOIN anhängen.

5.658 Beiträge seit 2006
vor 12 Jahren
SELECT
 ((IOut/0.2)*0.2) AS untereGrenze, 
((IOut/0.2+1)*0.2) AS obereGrenze
 FROM PE 

Diese Berechnung ergibt doch nichts anderes aus als dieser gekürzte Code:

SELECT
 IOut AS untereGrenze, 
 IOut+0.2 AS obereGrenze
 FROM PE 

Wahrscheinlich hast du vergessen zu runden, bzw. die Nachkommastellen abzuschneiden.

Christian

Weeks of programming can save you hours of planning

T
Toxo Themenstarter:in
64 Beiträge seit 2011
vor 12 Jahren

Ich sag mal da musst du etwas mehr investieren. du kannst aus den Daten 1,3,3,3,5,5 nicht die Zeilen 1,2,3,4,5 erzeugen. Dazu müsstest du dir erst eine (temporäre?) Tabelle mit der richtigen Schrittweite erzeugen und dann deine Daten per LEFT JOIN anhängen.

folgende Daten 1,3,5,7

(1/5)*5 = 0
(1/5+1)*5 = 5
+1 in Datenatz zwischen 0-5

(3/5)*5 = 0
(3/5+1)*5 = 5
+1 in Datensatz zwischen 0-5

(5/5)*5 = 5
(5/5+1)*5 = 10
+1 in Datensatz zwischen 5-10

(7/5)*5 = 5
(7/5+1)*5 = 10
+1 in Datensatz zwischen 5-10

resultat

untereGrenze|obereGrenze| Daten
0| 5|2
5|10|2

Was ist an dieser Überlegung falsch?

SELECT  
 ((IOut/0.2)*0.2) AS untereGrenze,   
((IOut/0.2+1)*0.2) AS obereGrenze  
 FROM PE   

Diese Berechnung ergibt doch nichts anderes aus als dieser gekürzte Code:

SELECT  
 IOut AS untereGrenze,   
 IOut+0.2 AS obereGrenze  
 FROM PE   

Wahrscheinlich hast du vergessen zu runden, bzw. die Nachkommastellen abzuschneiden.

Christian

Stimmt du hast recht. Mein Problem ist das ich eine Abfrage wollte die Funktioniert ohne das ich die Tabelle kenne oder weiß auf welchen Datentyp ich überhaupt zugreife. Das ist dann wohl doch noch nicht der richtige Weg.

5.658 Beiträge seit 2006
vor 12 Jahren

Daß es mit ganzzahligen Werten funktioniert, hast du doch bereits mehrfach angesprochen. Aber hast du diese Proberechnung auch mal mit unrunden Werten durchgeführt?

Bitte beachte [Hinweis] Wie poste ich richtig?

Christian

// Edit:
(7/5)*5 != 5

// Edit 2:
Ich glaub deine gesamte Rechnung ist falsch, wieso ist 1 / 5 * 5 und 3 / 5 * 5 gleich 0? Da stimmt doch irgendetwas hinten und vorne nicht.

Weeks of programming can save you hours of planning

T
Toxo Themenstarter:in
64 Beiträge seit 2011
vor 12 Jahren

// Edit 2:
Ich glaub deine gesamte Rechnung ist falsch, wieso ist 1 / 5 * 5 und 3 / 5 * 5 gleich 0? Da stimmt doch irgendetwas hinten und vorne nicht.

1/5 laut eigentlich 0,2 da die Werte aus einer Tabellenspalte kommt mit Datentyp smallInt ist 1/5 =0 und 0*5 =0
daher (1/5)*5 =0

5.658 Beiträge seit 2006
vor 12 Jahren

Ich glaube, wir drehen uns da im Kreis. Wenn du nicht weißt (oder nachschauen willst), daß sich Integer-Datentypen anders verhalten als Fließkommazahlen, dann fällt das eindeutig unter [Hinweis] Wie poste ich richtig?, Punkt 1.1.1

Christian

Weeks of programming can save you hours of planning

T
Toxo Themenstarter:in
64 Beiträge seit 2011
vor 12 Jahren

Ja aber genau das war doch meine Frage 🙁
Ob es möglich ist diese Art der Abfrage einfach anzupassen ohne das ich die Datenmenge "von Hand" durchfiltern muss.
Ja ich kenne die Unterschiede zwischen den Datentypen und im Prinzip wollte ich nur wissen ob die Art der Abfrage so Anwendbar ist oder ob man es Grundlegend ändern muss.

Ich strapaziere ein wenig unabsichtlich deine Geduld. Entschuldigung dafür.

5.658 Beiträge seit 2006
vor 12 Jahren

im Prinzip wollte ich nur wissen ob die Art der Abfrage so Anwendbar ist

Offenbar nicht.

oder ob man es Grundlegend ändern muss.

Ja, siehe meine und tkrasingers Antworten von oben.

Christian

Weeks of programming can save you hours of planning

5.742 Beiträge seit 2007
vor 12 Jahren

Ja aber genau das war doch meine Frage

Du meinst also, wie du quasi einen Cast in SQL durchführen kannst, sodass du mit Gleitkommazahlen rechnen kannst, obwohl deine Spalten vom Typ int sind?
Probiere es mal mit CAST und CONVERT (Transact-SQL)

Generell muss ich aber MrSparkle zustimmen, daher ==> geschlossen.

Thema geschlossen