2015-02-05 71 views
0

我有一個Postges數據庫一個很長的桌子和3列,像這樣:SQL GROUP BY重複行

s_id | c_id | a_id 
1 | 1 | 2 
1 | 1 | 3 
1 | 3 | 15 
2 | 1 | 2 
2 | 2 | 23 
3 | 1 | 2 
3 | 3 | 16 

我有一個查詢發現已C_ID 1和3的所有s_ids,返回他們和他們的計數:

SELECT s_id, COUNT(s_id) as matching_clusters 
FROM test 
WHERE c_id IN (1,3) 
GROUP BY s_id HAVING COUNT(c_id) >= 2 
ORDER BY matching_clusters DESC 

我得到的回覆是以下幾點:

s_id | matching_clusters 
1 |   3 
3 |   2 

但是,我只想計算重複C_ID一次,這樣的結果在這裏應該是

s_id | matching_clusters 
1 |   2 
3 |   2 

任何建議如何做到這一點?我認爲我可以將DISTINCT放入COUNT命令中,但這不起作用。我可以用不同的c_id在表本身上加入結果,但我不想重新運行查詢,因爲在這個表上運行查詢是非常昂貴的計算明智的。

+0

你指的是具有COUNT(DISTINCT C_ID)沒有工作? – jarlh 2015-02-05 13:08:36

回答

1

如果我理解正確的話,那麼這將工作:

SELECT s_id, 2 as matching_clusters 
FROM test 
WHERE c_id IN (1,3) 
GROUP BY s_id 
HAVING COUNT(c_id) >= 2 
ORDER BY matching_clusters DESC; 

這可能是你想要什麼:

SELECT s_id, COUNT(DISTINCT c_id) as matching_clusters 
FROM test 
WHERE c_id IN (1,3) 
GROUP BY s_id 
HAVING COUNT(DISTINCT c_id) = 2 
ORDER BY matching_clusters DESC; 

注意having子句中使用distinct

+0

也有必要在具有子句中使用不同。 – 2015-02-05 13:13:03

+0

@AnkitBajpai,是的,以避免1,1有效(沒有任何3)。 – jarlh 2015-02-05 13:14:13

+0

但我認爲沒有選擇領域中只使用不同的計數效果很好。 – 2015-02-05 13:16:20

-1

試試這個: -

SELECT s_id, COUNT(DISTINCT s_id) as matching_clusters 
FROM test 
WHERE c_id IN (1,3) 
GROUP BY s_id HAVING COUNT(c_id) >= 2 
ORDER BY matching_clusters DESC 
+0

由於group by s_id,matching_clusters將始終爲1。 – jarlh 2015-02-05 13:13:14

+0

@jarlh沒有underastand .... :( – 2015-02-05 13:15:09

+0

例如,對於每組s_id = 1,COUNT(DISTINCT s_id)將返回1. – jarlh 2015-02-05 13:18:17