SQL GROUP BY一个字段并同时列出另外两个字段的最新值

时间:2010-12-14 18:28:18

标签: sql sql-server sql-server-2008

考虑这些数据:

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,但使用最新的firstname / lastname(基于registration_date)。

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

id      firstname   lastname
101126423   foo         bar jr
101152718   john        doe

到目前为止,我得到了:

SELECT DISTINCT id, firstname, lastname
FROM member

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

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

1 个答案:

答案 0 :(得分: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