通过 postgres 12 中的特定规则获取过滤行

get filtered rows by especific rules in postgres12

附加信息:我的table从两行开始工作,第一行和第二行,id总是以1或2开头,但有时,我们必须重新处理它, 数字得到更新

我有一个显示很多 ID 的查询 通常,mi id 以 1 或 2 开头 例如:

1210001
2210001
1210002
1210003
2210002

有时,此行会因多种原因而更新,当系统更新时,第一个数字会得到 +2

1210001
2210001
1210002
1210003
2210002
3210001 from 1210001
4210001 from 2210001

同一个id可以更新2到3次

1210001
2210001
1210002
1210003
2210002
3210001
4210001
5210001 from 3210001
7210001 from 5210001

如何查询每个 ID 的最后更新?

1210002
1210003
2210002
4210001
7210001

我的table由两条工作线组成,第1行和第2行

例如,id: 1210001 和 2210001

此 ID 适用于第 1 行和第 2 行。

x21xxxx 这是年份 xxx0001 每行的最后一个数字是连续的

第一个数字可以是奇数或偶数,我正在尝试考虑从结果中删除旧 ID 的查询

Check out db<>fiddle example

这里需要一些数学知识。

鉴于“id”字段的低6位对于部分分组意义重大,这些低6位可以通过“id”mod1000000得到。

然后可以通过将“id”除以 1000000 来获得高位数字。高位数字根据它们是奇数还是偶数(奇偶校验)来定义组,因此此查询将 select 最新为每一行更新了“id”:

select max(id) as last_updated
from t
group by ((id / 1000000) % 2, id % 1000000);

此查询按高位 (>= 7) 的奇偶校验和低 6 位的数值对行进行分组。然后select是每组最大的id。

如果要删除旧行:

delete from t
where id not in
    (select max(id) as last_updated
     from t
     group by ((id / 1000000) % 2, id % 1000000));

Check out db<>fiddle example