2016-04-24 124 views
0

我找优雅的方式来写这个查询的PostgreSQL的版本与GROUP BY相同的查询DISTINCT:PostgreSQL的几个COUNT在其他领域

SELECT count(distinct a,b)/count(distinct c,d) 
FROM t1 
GROUP BY e; 

它可以通过CONCAT函数来完成,但这种情况下,我获得巨大的业绩下降。

每个计数明显可以写成这样:

SELECT count(*), e FROM 
(SELECT a, b, e FROM t1 GROUP BY a, b, e) as tmp 
GROUP BY e; 

SELECT count(*), e FROM 
(SELECT c, d, e FROM t1 GROUP BY c, d, e) as tmp 
GROUP BY e; 

但我无法找到如何将它们合并成一个查询来获取最后的结果

这里是创建表来测试语法:

CREATE TABLE t1 (
a int, 
b int, 
c int, 
d int, 
e int 
); 

回答

1

不确定优雅,但看起来像它可以这样做:

SELECT e, c1/c2 FROM 

(SELECT count(*) as c1, e FROM 
(SELECT a, b, e FROM t1 GROUP BY a, b, e) as sub1 
GROUP BY e) as tmp1 

INNER JOIN 

(SELECT count(*) as c2, e FROM 
(SELECT c, d, e FROM t1 GROUP BY c, d, e) as sub2 
GROUP BY e) as tmp2 

USING (e)