PostgreSQL подсчитывает другие значения ID, которые имеют то же значение, что и другие столбцы - PullRequest
0 голосов
/ 18 июня 2019

Допустим, у нас есть следующая таблица, в которой хранится id наблюдения и его address_id. Вы можете создать таблицу со следующим кодом:

drop table if exists schema.pl_address_cnt;
create table schema.pl_address_cnt (
    id serial,
    address_id int);

insert into schema.pl_address_cnt(address_id) values 
(100), (101), (100), (101), (100), (125), (128), (200), (200), (100);

Моя задача - подсчитать для каждого id, сколько других id с (то есть -1) имеют одинаковые address_id. Я пришел к решению, которое оказывается довольно дорогим (explain) по сравнению с исходным набором данных. Интересно, можно ли как-то оптимизировать мое решение.

with tmp_table as (select address_id
                        , count(distinct id) as id_count
                    from schema.pl_address_cnt
                    group by address_id
)
select id
    , id_count - 1
from schema.pl_address_cnt as pac
left join tmp_table as tt on tt.address_id=pac.address_id;

1 Ответ

1 голос
/ 18 июня 2019

Вы можете попытаться опустить CTE и выполнить самостоятельное соединение по общему адресу, но с другим идентификатором, а затем объединить это.

SELECT pac1.id,
       count(pac2.id)
       FROM pl_address_cnt pac1
            LEFT JOIN pl_address_cnt pac2
                      ON pac1.address_id = pac2.address_id
                         AND pac1.id <> pac2.id
       GROUP BY pac1.id
       ORDER BY pac1.id;

Для производительности вы можете попробовать индексы на (address_id, id) и (id).

...