PostgreSQL:使用 id 从 table 中删除行

PostgreSQL: Remove rows from a table using id's

我有一个帐单 table,其中 ID 作为 pk 和一个 billno 列,我应该从中删除重复项

总行数 (62924)

select count(billno) from bill

唯一的 billno (59704),因此需要删除 3220 行

select count(distinct billno) from bill

查询以获取重复项 (3220)

select count(*) from bill
    WHERE bill.billno IN (SELECT billno
                   FROM bill
                   GROUP BY billno HAVING COUNT(*) > 1)
    AND bill.company_code like '1'

然而,当我通过 id 删除重复项时,总数不符合 :-

删除重复行后计数 (61385) => 应在此处获取 59704..

select count (*) from bill
where bill.id not in
(
select id from bill
    WHERE bill.billno IN (SELECT billno
                   FROM bill
                   GROUP BY billno HAVING COUNT(*) > 1)
    AND bill.company_code like '1'
)

我能知道为什么会这样吗?

您似乎要删除所有 重复行。如果你想要一个没有重复的结果集,使用 distinct on:

select distinct on (billno) b.*
from bill b
order by billno, id desc;

这 returns 每个账单的行最高 id

我不确定为什么您的查询会过滤到该公司。该问题未提及该过滤。