2013-07-16 69 views
-2

我有跟隨着表結構TOP 1分組

 
person_id organization_id 
1   1 
1   2 
1   3 
2   4 
2   2 

我想要的結果設置爲

 
person_id  organization_id 
1    1 
2    4 

指的person_id

+2

可能出現[獲得每組最多1行]的副本(http://stackoverflow.com/questions/6841605/get-top-1-row-of-each-group) – GSerg

+5

這裏表的排序是什麼? –

+7

你不能這樣做,除非你的表中有一些其他列定義你需要的順序。不能依賴您在沒有訂單子句的情況下保持不變。沒有指定順序,「top 1」沒有意義。 – Blorgbeard

回答

1

TOP1您正在使用SQL Server,所以你可以使用row_number()。但是,如果沒有排序,您確實無法定義top - 結果無法保證。

所以,下面將做top沒有order by

select person_id, min(organization_id) 
from t 
group by person_id; 

然而,我假設你打算讓行的順序爲可預期的順序。唉,SQL表是無序所以排序是無效的。你真的需要一個idcreationdate或其他東西來指定順序。

所有這一切說,你可以嘗試以下方法:

select person_id, organization_id 
from (select t.*, 
      row_number() over (partition by person_id order by (select NULL)) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

這絕對是保證工作。根據我的經驗,order by (select NULL))以與select相同的順序返回行 - 雖然沒有這種效果的文檔(我已經找到)。請注意,在體面大小的表上的並行系統中,SQL Server返回順序與頁面上的行順序或插入順序無關。

+0

快速的問題,它是無關的......分句子句做什麼? – Sid