比方说,我们有下表存储观测值的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;
答案 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)
上建立索引。