2013-12-09 88 views
2

比方說,我有數字對的表:如何選擇具有唯一元素的最大子集對?

a | b 
--+-- 
1 | 1 
2 | 1 
3 | 1 
2 | 2 
4 | 2 
5 | 5 
1 | 3 

對於每個b我想選擇一個a如沒有兩個相同的a S代表不同b秒。

如果我做group by一個簡單的查詢:

select * from t group by b 

我得到以下結果反饋:

a | b 
--+-- 
1 | 1 
2 | 2 
5 | 5 
1 | 3 

a == 1b == 1b == 3

我要的反而是像這個:

a | b 
--+-- 
3 | 1 
2 | 2 
5 | 5 
1 | 3 

你能幫我解決這個問題嗎?我假設這種子集查詢有一個已知的術語,但我沒有意識到這一點,這使得搜索答案更困難。

如果查詢在給定的b中選擇最大的a,同時保持給定的唯一性約束,則爲獎勵分數。在我的例子,結果將是:

a | b 
--+-- 
3 | 1 
4 | 2 
5 | 5 
1 | 3 
+0

這聽起來像一個難題。如何解決兩個'b'只用一個'a'解決的情況?無論如何,我不認爲這種類型的問題是要在SQL中解決的。 – Andomar

回答

2

我認爲第一種方法是:

select MAX(a) as a, 
     b 
from t as t1 
where NOT EXISTS(select a from t where b<>t1.b and a=t1.a) 
     or 
     NOT EXISTS(select a from t where a in (select a from t where b=t1.b) 
       GROUP BY a 
       HAVING COUNT(*)=1) 

GROUP BY b 

SQLFiddle demo

我們應該按b,找到MAX(a)但是從主表的特殊子範圍。 首先我們應該得到所有a這是不存在的另一個b(這是第一個條件)。 但是在b=3的情況下,我們得到所有a存在於其他b的情況,所以第二個條件處理這種情況。

+0

雖然在較大的數據集上速度很慢,但似乎很準確。我有大約20萬這種記錄。我已經爲'a'和'b'添加了索引。有沒有其他方法可以加快這一操作? –

-2

請檢查這一點,我沒有驗證: -

SELECT max(a) AS a, b FROM t WHERE GROUP BY b 
+1

只有'最大(a)'沒有任何操作員?這是不正確的。 – krokodilko

2

試試這個

select max(a),b from t group by b; 
相關問題