2010-12-14 59 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 
相關問題