2014-01-27 95 views
0

我有一個視圖(這是幾個表的聯合),我需要篩選出重複。該表是這樣的:我如何使用GROUP BY選擇其他列與TSQL查詢

id first last logo  email entered 
1  joe  smith i.jpg  [email protected] 2014-01-27 
2  jim  smith b.jpg  [email protected] 2014-01-27 
3  bob  smith z.jpg  [email protected] 2014-01-27 
9  joeseph smith q.gif  [email protected] 2014-01-20 

我想要做這樣的事情,但我似乎無法得到一個有效的語法:

SELECT 
    email, MAX(entered), first, last -- such that first and last come from the same row as the MAX(entered) 
FROM 
    my_view 
GROUP BY 
    email 

回答

3

你想用row_number()

SELECT email, entered, first, last 
FROM (select v.*, row_number() over (partition by email order by entered desc) as seqnum 
     from my_view v 
    ) v 
WHERE seqnum = 1; 

row_number()是一個窗口函數連續的號碼分配到組行。這些組由partition by子句定義。在這種情況下,所有具有相同email的東西都在同一組中。第一行給出值1;該排序基於order by子句。

外部查詢選擇第一個,它具有最大的entered日期。

+0

謝謝。我接受了你的答案,因爲它更詳細地解釋了原因和原因。 – Nate

4

因爲你的名字是不一樣的重複的電子郵件行,則必須使用row_number()函數:

select email, entered, first, last 
from (
select *, row_number() over (partition by email order by entered desc) rn 
from my_view 
) x 
where rn = 1 

你需要一個子查詢,因爲row_number()沒有了where子句中允許的。

+0

問題在於,它不會從結果集中刪除重複的電子郵件。這給了我與沒有GROUP BY相同的結果。 – Nate

+0

您的示例數據與重複的電子郵件具有相同的名稱 - 您的真實數據不是這種情況嗎?\ – Blorgbeard

+0

好點。在我的示例中,名稱是相同的,在我的真實數據中,某些列將是相同的,但有些不會。我會更新我的示例。 – Nate