2010-12-14 64 views
0

采取在考虑这样的数据:SQL GROUP BY一个字段,并列出同时另外两个领域的最新值

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 

你可以有客户与具有相同id但有不同的firstname/lastname!我想获得所有截然不同的 ID但带有最新的名/姓(基于registration_date)。

对于我的例子,我会得到:

id  firstname lastname 
101126423 foo   bar jr 
101152718 john  doe 

到目前为止我:

SELECT DISTINCT id, firstname, lastname 
FROM member 

,但它显然不工作...我到目前为止已经试过其他查询没有成功。也许having可以帮助我,但我从来没有用过它...

我在这个项目中使用SQL Server 2008。

回答

1

你一对夫妇的选择:

选项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 

选项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 

两个最大的区别,关于它们的结果,是他们如何处理最近一次注册时间与具有多个名称的ID重复的情况。在这种情况下,选项1将返回具有最新注册日期的两个名称,而选项2将只返回一个(随机)。这种情况的一个例子是(对您的样本数据进行微调):

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 
相关问题