2017-02-02 1 views
0

Ich bin mir sicher, dass diese Frage bereits beantwortet wurde, aber es ist schwer zu formulieren, und ich habe ein paar Stunden bei Google verbracht und immer noch keine Lösung gefunden.SQL-Abfrage zum Zurückgeben eines Datensatzes für eine Spalte mit duplizierten Werten basierend auf dem Datum einer anderen Spalte

Ich habe eine Tabelle (Ansicht), die eine Aufzeichnung der Geräteseriennummern hat, die vermietet werden. Die Zeile wird von einem Kundenauftrag erstellt, wenn wir ein Gerät versenden (Status = Shipped), und wenn das Gerät zurückgegeben wird, wird derselbe Datensatz aktualisiert (Status = Zurückgegeben). Das TransDate wird aktualisiert, wenn es versendet und dann zurückgegeben wird.

Jetzt ist ein Gerät zurück in unserem Lager, wir werden es wieder vermieten, dieses Mal mit einer neuen Bestellung (weil es 99% ein anderer Kunde sein wird). Wir bekommen also eine neue Zeile in der Tabelle, mit einer neuen Bestellnummer, aber natürlich mit der gleichen Seriennummer.

Hier einige Beispieldaten (aber es gibt viele weitere Felder in der realen Tabelle)

SerNo TransDate OrdNo Status  (record id for describing the issue) 
1111 20170105 1234 Returned 1 
2222 20161220 1235 Shipped 2 
3333 20170105 1235 Returned 3 
4444 20170105 1236 Returned 4 
1111 20170115 1311 Returned 5 
4444 20170110 1312 Shipped 6 
6666 20170110 1313 Shipped 7 
1111 20170125 1401 Shipped 8 

Meine Herausforderung ist, dass ich eine SELECT-Abfrage benötigen, die nur ein Datensatz für jede Seriennummer zurück das ist in der Tabelle ... und wo es mehr als einen Datensatz für die gleiche Seriennummer gibt, brauche ich den mit dem spätesten Datum.

Mit anderen Worten das Ergebnis würde Datensatz-IDs: 2, 6, 7, 8 (Geräte bei Kunden) UND 3 (weil dies zurückgegeben, aber nicht erneut geliefert) enthalten.

(Datensätze 1, 4, 5 wurden zurückgegeben, aber dann wieder vermietet, so dass sie jetzt nur historische Datensätze sind und nicht den aktuellen Status darstellen).

Ich weiß GROUP BY wird nicht funktionieren, weil ich die anderen Felder aggregieren muss, und ich brauche alle anderen Felder (es gibt viele mehr) aus dem Datensatz mit dem neuesten Datum für eine bestimmte Seriennummer.

Wir laufen diese auf SQL Server 2012

Vielen Dank im Voraus!

+0

Gibt es für jede Zeile eine eindeutige 'RecordId' (oder eine andere Spalte)? Etwas, das Sie mit 'Row_Number()' partitioniert von 'SerNo' und geordnet nach' TransDate' (absteigend) verwenden könnten, um die letzte Zeile für jede Zeile zu identifizieren (Zeilennummer = 1)? fyi: SQL Server 11 ist für die meisten Benutzer SQL Server 2012. – HABO

Antwort

0

Sie können die Funktion row_number verwenden, um die erste Zeile für jedes Serno zu erhalten, das nach absteigender Transdate geordnet ist.

select serno,transdate,ordno,status 
from (
select t.*, row_number() over(partition by serno order by transdate desc) as rnum 
from data t 
) x 
where rnum=1 
Verwandte Themen