2016-04-24 16 views
0

私はこのクエリのPostgreSQLのバージョンを書くためのエレガントな方法を探しています:PostgreSQLの他のいくつかのフィールドでGROUP BYと同じクエリでDISTINCT COUNT

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

それはCONCAT関数を介して行うことができますが、それこの場合、Iパフォーマンスが大幅に低下します。

各個別のカウントは、このように書くことができます。

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; 

しかし、私は最終的な結果

を取得するために、1つのクエリにそれらを結合する方法を見つけることができませんここで構文をテストするテーブルを作成します:

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) 
関連する問題