2015-02-05 70 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