2010-12-14 47 views
0

, prenez en considération ces données:GROUP SQL par un champ et la liste la plus récente valeur de deux autres domaines en même temps

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 

Vous pouvez avoir des clients avec le même id mais avec un autre firstname/lastname! Je veux obtenir tous les distincts mais avec le nom et la prénoms (selon le date d'enregistrement).

Pour mon exemple, je recevrais:

id  firstname lastname 
101126423 foo   bar jr 
101152718 john  doe 

Jusqu'à présent, je suis arrivé:

SELECT DISTINCT id, firstname, lastname 
FROM member 

mais il est de toute évidence ne fonctionne pas ... J'ai essayé d'autres requêtes sans succès jusqu'à présent. Peut-être having peut m'aider mais je ne l'ai jamais utilisé ...

J'utilise SQL Server 2008 dans ce projet.

Répondre

1

Un couple d'options pour vous:

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 

La plus grande différence dans les deux, en ce qui concerne leurs résultats, est la façon dont ils gérer le cas où l'heure d'enregistrement la plus récente est dupliquée pour un identifiant avec plusieurs noms. Dans ce cas, l'option 1 renverra les deux noms qui ont la dernière date d'enregistrement et l'option 2 n'en renverra qu'une (de manière aléatoire). Un exemple de ce cas est (un léger ajustement de vos données d'échantillon):

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