SEE EDITS UNTERAuswahl unterschiedliche Werte von mehreren Spalten mit mehreren Tabellen
ich eine Liste in SQL Server 2012 zu bauen bin versucht, die dies zeigt:
Serial FW_Ver DeviceName UserName LastUpload LastRecord
12345678 998 Test1 User1 2016-02-22 17:31:28 2016-02-19 11:14:15
45678912 998 Test2 User5 2016-03-14 16:24:17 2016-03-14 12:24:57
78978979 600 Test3 User12 2016-01-31 09:12:48 2016-01-30 23:49:12
45554468 NULL Test4 NULL NULL NULL
Dieses aus drei verschiedenen Tabellen gebaut innerhalb derselben Datenbank. Die Seriennummern in der Gerätetabelle sind alle eindeutig und ohne Duplikate. Daher möchte ich die Ergebnisse für alle Seriennummern sehen, auch wenn sie noch keine Dateien hochgeladen haben. Meine aktuelle Abfrage gibt mir die Ergebnisse ich will, aber mit einigen unerwünschten Zusätzen wie unten (ersten 3 Zeilen) dargestellt:
Serial FW_Ver DeviceName UserName LastUpload LastRecord
12345678 772 Test1 User1 2016-02-22 17:30:18 2014-01-01 16:19:06
12348678 891 Test1 User1 2016-02-22 17:30:31 2015-02-16 15:41:56
12345678 998 Test1 User1 2016-02-22 17:31:28 2016-02-19 11:14:15
45678912 998 Test2 User5 2016-03-14 16:24:17 2016-03-14 12:24:57
78978979 600 Test3 User12 2016-01-31 09:12:48 2016-01-30 23:49:12
45554468 NULL Test4 NULL NULL NULL
Wie Sie sehen können, bin ich immer die neuesten Datetimes für ein bestimmtes Gerät für jede Version der Firmware, die es verwendet hat. Ich will das nicht, ich möchte nur die neueste Datetime aus der neuesten Datei unabhängig von der Firmware-Version aufgeführt.
Hier ist meine Abfrage so weit:
SELECT d.Serial,
de.Firmware AS FW_Ver,
d.DeviceName,
MAX(de.CreatedOn) AS LastUploadedDate,
MAX(de.EventTimeStamp) AS LastRecordingDate
FROM AuroraCore.dbo.DeviceEvent AS de
RIGHT JOIN AuroraCore.dbo.Device AS d ON d.Id = de.DeviceId
GROUP BY d.Serial, de.firmware, d.DeviceName
Ich versuchte MAX(de.Firmware) OVER (PARTITION BY d.serial) AS FW_Ver
verwenden, aber das gibt die gleiche Anzahl von Ergebnissen und die Firmware-Version wird dann nur als die höchste Nummer für das angegebene Gerät (998 x 3 gezeigt anstelle von 772, 891 und 998, wie in den oberen 3 Zeilen in der obigen Tabelle angezeigt).
Wie kann ich die Datumswerte von NUR die neueste (n) Datei (en) für ein bestimmtes Gerät abrufen und die entsprechende Version der Firmware zurückgeben? Ich möchte die Priorität für das hochgeladene Datum und das aufgezeichnete Datum angeben. Vielen Dank!
EDIT 1: Ich kann mit diesem den zusätzlichen, unerwünschten Informationen loszuwerden:
SELECT d.Serial,
t.Firmware AS FW_Ver,
d.DeviceName,
MAX(t.CreatedOn) AS LastUpload,
MAX(t.EventTimeStamp) AS LastRecord
FROM (
SELECT de.DeviceId,
de.Firmware,
de.CreatedOn,
de.EventTimeStamp,
ROW_NUMBER() OVER (PARTITION BY DeviceId ORDER BY Firmware DESC) AS RN
FROM AuroraCore.dbo.DeviceEvent AS de
) AS t
RIGHT JOIN AuroraCore.dbo.Device AS d ON d.Id = t.DeviceId
WHERE RN = 1
GROUP BY d.serial, t.Firmware, d.DeviceName
Nun das Problem ist, dass mit WHERE RN = 1
verursacht keine der NULL
Werte während erhalten zurück Ich brauche diese, um angezeigt zu werden. Das Entfernen der WHERE
bekommt mir die gleiche genaue Ergebnisliste wie zuvor. Wo kann ich die WHERE RN = 1
-Klausel verschieben/anpassen, sodass auch NULL
Werte zurückgegeben werden?
Ich vermisse die Spalte "Beschreibung" in Beispieldaten. Ist das kein Problem? – TcKs
Ich entschuldige mich, ich habe es aus den Ergebnissen entfernt, da sie alle leer waren und meine Ergebnisse sowieso nicht beeinflusst haben. Der Hauptbeitrag wird aktualisiert. – Trevor
Die Hauptpost aktualisiert, um meine Frage zu klären, da sie vorher nicht kurz war. – Trevor