2017-04-21 1 views
0

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?

+0

Ich vermisse die Spalte "Beschreibung" in Beispieldaten. Ist das kein Problem? – TcKs

+0

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

+0

Die Hauptpost aktualisiert, um meine Frage zu klären, da sie vorher nicht kurz war. – Trevor

Antwort

1

Ich habe es durch die unten Abfrage arbeiten:

SELECT d.Serial, 
t.Firmware AS FW_Ver, 
d.DeviceName, 
MAX(t.CreatedOn) AS Upload, 
MAX(t.EventTimeStamp) AS Record 

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 OR t.CreatedOn is NULL 

GROUP BY d.serial, t.Firmware, d.DeviceName 

Alles, was ich in meiner vorherigen bearbeiten hinzugefügt wurde OR t.CreatedOn is NULL, die die NULL-Werte enthalten, wie ich wollte. Mit der in Verbindung mit der WHERE RN = 1 wurde, was die älteren Firmware-Versionen angezeigt wurde angezeigt, da die Unterabfrage nur die höchste Version der Firmware (wie von der PARTITION BY DeviceId ORDER BY Firmware DESC diktiert) für ein bestimmtes Gerät und anschließend nur die neuesten Datumsangaben für die hochgeladene und aufgezeichnete Daten

Verwandte Themen