2017-10-26 2 views
0

Ich habe Multiple Datensätze nach Mitarbeiter, Standort und zuletzt aktualisiert, und ich muss nur die mit Max (LastAktualisiert) für jeden Mitarbeiter auswählen.Suche nach spezifischen Datensatz

employee location lastupdated 
59 All locations 2017-10-23T15:44:53 
12 Payroll and Benefits 2017-10-23T06:26:44 
13 North York 2017-10-26T09:41:52 
13 East York 2017-10-06T12:05:40 
13 North York 2017-10-18T14:25:36 
14 CEO  2017-10-26T09:45:58 
14 DownTown 2017-08-01T16:44:54 
15 Energey 2017-10-24T08:22:35 
15 Smart Buildings 2017-10-25T19:59:53 

Zum Beispiel sollten die folgenden Datensätze zurückgegeben werden:

59 All locations 2017-10-23T15:44:53 
    12 Payroll and Benefits 2017-10-23 T06:26:44 
    13 North York 2017-10-26T09:41:52 
    14 CEO 2017-10-26T09:45:58 
    15 Smart Buildings 2017-10-25T19:59:53 


SELECT employee, location, max(lastupdated) 
FROM employee 
GROUP BY employee, location; 

Dies ist nicht als max Datum Arbeit ausgewählt basiert auf Mitarbeiter und die Lage, ich möchte nur einen Datensatz wählen, mit max (Zuletzt aktualisiert), sollte dieser Datensatz Mitarbeiter-, Standort- und Lastaktualisierungsfelder enthalten.

Vielen Dank im Voraus.

Antwort

3

Es gibt ein paar Lösungen:

SELECT TOP 1 employee, location, lastupdated 
FROM employee 
ORDER BY lastupdated DESC 

Dies wird immer 1 Datensatz zurückkehren, und wenn es Verbindungen sind, wird es nur eine auswählen. Dies kann oder kann nicht sein, was Sie wollen. Wenn Sie Bindungen wünschen, können Sie SELECT TOP (1) WITH TIES [...] angeben.

Alternativ:

SELECT employee, location, lastupdated 
FROM employee 
WHERE lastupdated = (SELECT MAX(lastupdated) FROM employee) 

Hier finden Sie immer alle Verbindungen erhalten, so dass Sie mehrere Datensätze im Falle eines Unentschiedens erhalten kann. Auch dies kann oder kann nicht sein, was Sie wollen.


Da die aktualisierte Frage:

;WITH CTE AS (
    SELECT employee, 
     location, 
     lastupdated, 
     ROW_NUMBER() OVER (PARTITION BY employee ORDER BY lastupdated DESC) rn 
    FROM employee 
) 
SELECT employee, location, lastupdated 
FROM CTE 
WHERE rn = 1; 

Dies ist die "größte N pro Gruppe" -Problem. Dies ist die typische Lösung (überall außer MySQL). Wenn Sie Bindungen einfügen möchten, sollten Sie anstelle der ROW_NUMBER() die analytische Funktion RANK() oder DENSE_RANK() verwenden.

+0

Perfekt, vielen Dank. Diese Frage wird beantwortet. – Muhammad

Verwandte Themen