PostgreSQL计算ID的其他值与其他列的值相同

时间:2019-06-18 12:59:53

标签: postgresql group-by count

比方说,我们有下表存储观测值的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 个答案:

答案 0 :(得分:1)

您可以尝试省略CTE,并在公共地址但ID不同的情况下进行左连接,然后将其汇总。

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)上建立索引。