2016-06-13 15 views
-1

Ich habe eine Tabelle mit Spalten id, first, last, date_added.SQL Server: Aggregat Funktion Dilemma

Ich möchte eine Liste aller Vornamen und das neueste Einstellungsdatum für jeden Vornamen erhalten, aber ich möchte auch den Nachnamen des Mitarbeiters erhalten. Kann nicht sehen, eine Abfrage zu schreiben, die das tut! Ich denke, ich muss mich an denselben Tisch setzen?

Mein bester Versuch so weit:

select 
    users.first, users.last, u2.date_added 
from 
    (select 
     first, max(date_added) as date_added 
    from users 
    group by first) u2 
left join 
    users on u2.first = users.first 
group by 
    users.first, users.last, u2.date_added 
order by 
    users.first 

Antwort

-1

Wenn ich die Frage falsch verstanden haben sicherlich zu einer Gruppe Sie müssen nur die Daten? Beispiel dafür ist:

select first, last, max(date_added) as date_added 
from users 
group by first, last 
+3

Ich denke, du hast missverstanden. – Strawberry

+0

Das gibt mir eine Liste von mehr, als ich suche. Also, wenn mein Tisch zwei Einträge für "Tom" hat (wir werden sagen Tom Delonge - hinzugefügt 1/1/16 und Tom Hanks hinzugefügt 1/2/16), würde das Ergebnis mir beide Toms zeigen. Ich würde nur nach Tom Hanks suchen, da er zuletzt hinzugefügt wurde – AstToTheRegionalMgr

0

Wenn Sie nur nach Vornamen gehen werden (was sehr neugierig scheint), dann würde ich empfehlen row_number():

select u.first, u.last, u.date_added 
from (select u.*, row_number() over (partition by first, date_added desc) as seqnum 
     from users u 
    ) u 
where seqnum = 1; 
+0

Das hat ziemlich gut funktioniert! Ich musste eine kleine Änderung vornehmen, aber danke, dass du mich in diese Richtung gelenkt hast. – AstToTheRegionalMgr

0

Ihr bester Versuch war in der Nähe, aber Sie müssen zurück kommen zu deinem Maximum (date_added), wie unten

DECLARE @users TABLE 
    (
     id int IDENTITY(1,1) 
     , first varchar(100) 
     , last varchar(100) 
     , date_added datetime 
    ) 

INSERT INTO @users 
    (first 
    ,last 
    ,date_added 
    ) 
    SELECT 'john', 'doe', GETDATE() 
    UNION SELECT 'john', 'deere', DATEADD(d, 1, GETDATE()) 
    UNION SELECT 'jane', 'doe', GETDATE() 

--actual data 
SELECT * FROM @users 

--desired output 
SELECT 
    u.* 
    FROM @users u 
    INNER JOIN (
     SELECT first, max(date_added) AS date_added_max 
     FROM @users 
     GROUP BY first 
    ) max_u 
    ON u.first = max_u.first 
    AND u.date_added = max_u.date_added_max 
ORDER BY u.first