删除 sql 中不区分大小写的重复项 (postgres)
Remove case insensitive duplicates in sql (postgres)
我有一个 postgresql 数据库,我正在尝试删除(或什至只是获取 ID)我 table 中较旧的重复项,但只有那些因为大小写灵敏度,例如 helLo
和 hello
.
table 非常大,我的嵌套查询需要很长时间,我想知道是否有更好、更有效的方法来一次完成我的查询,而不是将其拆分为多个查询,因为有很多 id 有问题
SELECT * FROM some_table AS out
WHERE (SELECT count(*) FROM some_table AS in
WHERE out.text != in.text
AND LOWER(in.text) = LOWER(out.text)
AND in.created_at > out.created_at) > 1
谢谢!
你能试试吗
SELECT LOWER(text), ROW_NUMBER() OVER( PARTITION by LOWER(text) ORDER by created_at ) as rn
FROM some_table
然后您可以使用 rn
列作为过滤器
为了帮助这个查询,在 LOWER(text)
上创建一个 expression index。在索引中包含 created_at
以帮助进行日期比较。
CREATE INDEX text_lower ON some_table(LOWER(text), created_at);
不过,如果没有您的数据,很难对此进行测试。
我有一个 postgresql 数据库,我正在尝试删除(或什至只是获取 ID)我 table 中较旧的重复项,但只有那些因为大小写灵敏度,例如 helLo
和 hello
.
table 非常大,我的嵌套查询需要很长时间,我想知道是否有更好、更有效的方法来一次完成我的查询,而不是将其拆分为多个查询,因为有很多 id 有问题
SELECT * FROM some_table AS out
WHERE (SELECT count(*) FROM some_table AS in
WHERE out.text != in.text
AND LOWER(in.text) = LOWER(out.text)
AND in.created_at > out.created_at) > 1
谢谢!
你能试试吗
SELECT LOWER(text), ROW_NUMBER() OVER( PARTITION by LOWER(text) ORDER by created_at ) as rn
FROM some_table
然后您可以使用 rn
列作为过滤器
为了帮助这个查询,在 LOWER(text)
上创建一个 expression index。在索引中包含 created_at
以帮助进行日期比较。
CREATE INDEX text_lower ON some_table(LOWER(text), created_at);
不过,如果没有您的数据,很难对此进行测试。