Jump to content

Doppelte Abfrage - Maximalwert von DeviceIDs


Direkt zur Lösung Gelöst von icrazy,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

Hallo,

 

ich habe eine Tabelle die mit ca. 1 Million Einträge befüllt ist:

 

Aufbau:

DeviceID, Datum, Farbe, Wert

 

Ich möchte nun, dass DeviceID, Farbe, Wert angezeigt werden, jedoch nur das letzte Datum (also von heute) pro DeviceID.

 

Ich stehe wirklich auf dem Schlauch und bekomme es nicht hin.

 

Danke für Eure Hilfe

Geschrieben

naja ist ein wneig komplexer der Tabellenaufbau, wollte es hier vereinfacht darstellen:

 

Hier mal meine Abfrage:


 

SELECT MAX(ash.TimeLocal), ash.DeviceId, ad.Model, ad.SerialNo, ash.SnmpColorant, ash.sValue AS Schwarz
FROM ACCSNMPHISTORY ash

INNER JOIN ACCDEVICES ad
ON ash.DeviceId = ad.id

WHERE ash.SnmpColorant = 'black' 
GROUP BY ash.DeviceId, ad.Model, ad.SerialNo, ash.SnmpColorant, ash.sValue
ORDER BY DeviceId

 

Das ist jetzt mal mit der Farbe schwarz, die Abfrage zeigt mir aber nun unterschiedliche TimeLocal Werte an von einer DevideID. D.h. eine DevideID wird zig mal angezeigt mit unterschiedlichen Werten...

Geschrieben
vor einer Stunde schrieb icrazy:

ash.sValue AS Schwarz

HI

Was ist das für ein Wert (ash.sValue)?

Ich gehe davon aus das sich das Model immer gleich bleibt bei einer ID aber möglicherweise ändert sich dieser ash.Value womit du für die selbe DeviceID unterschiedliche Werte bekommst.

Geschrieben (bearbeitet)

Moin,

 

Wenn du eine "Gruppe" pro DeviceId haben willst, musst du dir Gruppierung so definieren, dass es in anderen Feldern keine Unterschiede gibt. Die Gruppe wird in SQL nur dann gebildet, wenn alle betrachteten Werte gleich sind.

 

(Das dürfte in etwa das sein, was auch MDD meint.)

 

Bekommst du also pro ID mehrere Zeilen, dann werden die sich irgendwo unterscheiden.

 

Es gibt dabei auch oft mehr als einen Weg. Hier dürfte auch ein Sub-Select als Lösungsansatz in Frage kommen. Ein Select könnte dabei nur die DeviceId und das Datum rausfinden, der andere mit diesen Ergebnissen den Rest. Das kann sich in großen Datenbanken auch in der Performance dramatisch unterscheiden, aber vielleicht kommt es darauf hier gar nicht an.

 

Gruß, Nils

 

bearbeitet von NilsK
Geschrieben

sValue ist der Schwellenwert der in meinem Beispiel genannten Farbe "schwarz". Dieser ändert sich täglich, deshalb das Datum Timelocal

Ich möchte nun pro DeviceID und dem letzten (aktuellsten) Wert von Schwarz

 

Das sollte so aussehen:

 

aktuellstes Datum, DeviceID, Modell, Seriennummer, Farbe, Value

 

Also pro DevideID (das sind ca. 40.000 Stück den aktuellsten Wert

 

Geschrieben

2 Fragen:

Ist Timelocal in Verbindung mit deiner DeviceId so eindeutig dass du einen eindeutigen Datensatz erhältst oder gibt es irgendwo noch eine inkriminierende Nummer?

 

Welche Version von SQL verwendest du?

 

Geschrieben (bearbeitet)
With tab1 as
(
SELECT 
	MAX(TimeLocal) as MaxTime, 
	DeviceId
FROM ACCSNMPHISTORY 
	--WHERE ash.SnmpColorant = 'black'
	WHERE SnmpColorant = 'black'
	GROUP BY DeviceId
)
SELECT  
  tab1.MaxTime,  
  tab1.DeviceID,
  ad.Model,
  ad.SerialNo,
  ash.SnmpColorant, 
  ash.sValue AS Schwarz
FROM tab1
	INNER JOIN ACCSNMPHISTORY as ash ON tab1.MaxTime = ash.TimeLocal AND tab1.DeviceID = ash.DeviceID
	INNER JOIN ACCDEVICES ad ON ash.DeviceId = ad.id
ORDER BY DeviceId

So sollte es eigentlich gehen. Kanns leider nicht austesten.

bearbeitet von MDD
Die Abfrage müßte einen Fehler geworfen haben da in der CTE ein unbekannter Alias verwendet wurde
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!
Gast
Dieses Thema wurde für weitere Antworten geschlossen.
×
×
  • Neu erstellen...