icrazy 0 Geschrieben 4. August 2020 Melden Teilen Geschrieben 4. August 2020 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 Link zu diesem Kommentar
Sunny61 806 Geschrieben 4. August 2020 Melden Teilen Geschrieben 4. August 2020 Was fehlt dir denn? Was genau hast Du denn schon? Zeig doch mal dein Query das Du bisher hast. Hint: GroupBy, Select Top 1 und Order By ASC sollte als Suchbegriff weiter helfen. :) Link zu diesem Kommentar
icrazy 0 Geschrieben 4. August 2020 Autor Melden Teilen Geschrieben 4. August 2020 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... Link zu diesem Kommentar
MDD 12 Geschrieben 4. August 2020 Melden Teilen Geschrieben 4. August 2020 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. Link zu diesem Kommentar
NilsK 2.934 Geschrieben 4. August 2020 Melden Teilen Geschrieben 4. August 2020 (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 4. August 2020 von NilsK Link zu diesem Kommentar
icrazy 0 Geschrieben 4. August 2020 Autor Melden Teilen Geschrieben 4. August 2020 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 Link zu diesem Kommentar
MDD 12 Geschrieben 5. August 2020 Melden Teilen Geschrieben 5. August 2020 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? Link zu diesem Kommentar
icrazy 0 Geschrieben 5. August 2020 Autor Melden Teilen Geschrieben 5. August 2020 ich erhalte einen eindeutigen Datensatz pro DeviceID und Farbe, ja! SQL Server 15 und Management Studio 18 Link zu diesem Kommentar
MDD 12 Geschrieben 5. August 2020 Melden Teilen Geschrieben 5. August 2020 (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 5. August 2020 von MDD Die Abfrage müßte einen Fehler geworfen haben da in der CTE ein unbekannter Alias verwendet wurde Link zu diesem Kommentar
Beste Lösung icrazy 0 Geschrieben 5. August 2020 Autor Beste Lösung Melden Teilen Geschrieben 5. August 2020 das geht so überhaupt nicht, da kommen alle anderen Werte die nichts mit black zu tun haben. Habe aber die Abfrage selbst hinbekommen. Danke Link zu diesem Kommentar
MDD 12 Geschrieben 5. August 2020 Melden Teilen Geschrieben 5. August 2020 Sorry hatte einen Alias zuviel mitkopiert. wenn man das WHERE dann rauslöscht kommen natürlich alle daten Link zu diesem Kommentar
icrazy 0 Geschrieben 5. August 2020 Autor Melden Teilen Geschrieben 5. August 2020 ich habe kein Where rausgelöscht Link zu diesem Kommentar
Sunny61 806 Geschrieben 5. August 2020 Melden Teilen Geschrieben 5. August 2020 vor 8 Stunden schrieb icrazy: Habe aber die Abfrage selbst hinbekommen. Du darfst sie gerne hier posten, Danke. Link zu diesem Kommentar
icrazy 0 Geschrieben 6. August 2020 Autor Melden Teilen Geschrieben 6. August 2020 vor 15 Stunden schrieb Sunny61: Du darfst sie gerne hier posten, Danke. laut deiner Aussage würde doch deine Abfrage auch funktionieren! Link zu diesem Kommentar
NilsK 2.934 Geschrieben 6. August 2020 Melden Teilen Geschrieben 6. August 2020 (bearbeitet) Moin, Der Sinn eines Forums, wie dieses eins ist, besteht darin, dass alle voneinander lernen und alle etwas beitragen. Gruß, Nils bearbeitet 6. August 2020 von NilsK 1 Link zu diesem Kommentar
Empfohlene Beiträge