我正在尝试分类数据,似乎从我的数据库表相似。
表是这样的
<表类>
id
账户
tbody><<tr>1 011 211 3 023 423 5456 表类>
with data as (
select
id,
account as account1,
last_value(account) over (partition by account::numeric) as account2
from your_table
)
select id, account1, account2 from data where account1 != account2;
那么,简单的答案是正确地将account
存储为数字或整数数据类型,然后只需检查重复项,删除它们,最后对account
施加唯一约束-完成问题解决了。但假设我将听到,我不能改变数据库成为一个不同的故事。您需要做的第一件事是过滤掉任何非数字帐户值(可能只是我,但我从不相信文本列实际上包含数字数据)。然后在剩下的元素上做一个self并赋值新的id。结果变成:(见演示)
with num_acct (id, account) as
(select *
from test
where account ~ '^[0-9]+$'
)
select row_number() over() as id
, na1.account as account1
, na2.account as account2
from num_acct na1
join num_acct na2
on ( na1.account::integer = na2.account::integer
and na1.id < na2.id
);
这不是一个明显的
- 数据类型;
- 什么意思account2场结果表; 哪些数据必须放在id字段的结果表中;
以下是快速可靠的解决方案。
在子查询中计数唯一的数据计数(*)聚合函数。
SELECT id, account::INTEGER
FROM
(select *, count(account::INTEGER) over (partition by account::INTEGER) as count from
(VALUES
(1, '011'),
(2, '11'),
(3, '023'),
(4, '23'),
(5, '456')
) as "ID"(id, account)) as "ID"(id, account)
where count > 1