2010-12-14 9 views
0

Nimm unter Berücksichtigung dieser Daten:SQL GROUP BY ein Feld und Liste neuesten Wertes von zwei anderen Bereichen zugleich

id  firstname lastname registration_date 
101126423 foo   bar  2010-06-17 13:31:00.000 
101126423 foo   bar  2010-06-17 13:31:00.000 
101126423 foo   bar jr 2010-06-18 12:13:00.000 
101152718 john  doe  2010-02-26 19:08:00.000 
101152718 john  doe  2010-02-26 19:08:00.000 
101152718 john  doe  2010-02-26 19:08:00.000 

Sie können Kunden mit den gleichen id haben, aber mit einem anderen firstname/lastname! Ich möchte alle distinct IDs aber mit dem neuesten Vornamen/Nachnamen (basierend auf Registrierungsdatum) bekommen.

Für mein Beispiel würde ich:

id  firstname lastname 
101126423 foo   bar jr 
101152718 john  doe 

Bisher bekam ich:

SELECT DISTINCT id, firstname, lastname 
FROM member 

aber es ist offensichtlich nicht funktioniert ... Ich habe ohne Erfolg versucht, andere Abfragen bisher. Vielleicht having kann mir helfen, aber ich habe es nie verwendet ...

Ich benutze SQL Server 2008 in diesem Projekt.

Antwort

1

Ein paar Möglichkeiten für Sie:

Option 1:

;with cte as(
    select id, max(registration_date) lastReg 
    from member 
    group by id 
) 
select distinct m.id, m.firstname, m.lastname 
from member m 
    join cte c on m.id=c.id 
      and m.registration_date = c.lastReg 

Option 2:

;with cte as(
    select id, firstname, lastname, 
     row_number() over(partition by id order by registration_date desc) as 'order' 
    from member 
) 
select id, firstname, lastname 
from cte 
where order = 1 

Der größte Unterschied in den beiden, im Hinblick auf ihre Ergebnisse ist, wie sie Behandle den Fall, bei dem die letzte Registrierungszeit für eine ID mit mehreren Namen dupliziert wird. In diesem Fall gibt Option 1 beide Namen zurück, die das neueste Registrierungsdatum haben, und Option 2 gibt nur einen zurück (nach dem Zufallsprinzip). Ein Beispiel für diesen Fall ist (eine kleine Optimierung Ihrer Probendaten):

id   firstname lastname registration_date 
101126423 foo   bar   2010-06-17 13:31:00.000 
101126423 foo   bar   2010-06-18 12:13:00.000 
101126423 foo   bar jr  2010-06-18 12:13:00.000 
101152718 john  doe   2010-02-26 19:08:00.000 
101152718 john  doe   2010-02-26 19:08:00.000 
101152718 john  doe   2010-02-26 19:08:00.000 

--Option 1 result: 
id   firstname lastname 
101126423 foo   bar 
101126423 foo   bar jr 
101152718 john  doe 

--Option 2 result (possibility 1): 
id   firstname lastname 
101126423 foo   bar 
101152718 john  doe 

--Option 2 result (possibility 2): 
id   firstname lastname 
101126423 foo   bar jr 
101152718 john  doe