PostgreSQL несколько COUNT DISTINCT в одном запросе с GROUP BY в другом поле

я ищу элегантный способ написать версию PostgreSQL этого запроса:

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 
);

person Oleksandr Voytsekhovskyy    schedule 24.04.2016    source источник


Ответы (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)
person Oleksandr Voytsekhovskyy    schedule 24.04.2016