首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除重复数超过5的记录

删除重复数超过5的记录
EN

Stack Overflow用户
提问于 2014-06-23 10:47:30
回答 3查看 131关注 0票数 1

我在一个长度为9的表中有数据,其中的数据如下

代码语言:javascript
复制
999999969
000000089
666666689

我只想删除那些从1-9中的任何数字重复超过5次的数据。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-23 18:54:16

这可以是,使用一个使用反向参考的正则表达式的要简单得多。

代码语言:javascript
复制
DELETE FROM tbl
WHERE  col ~ '([1-9])\1{5}';

就这样。

解释

([1-9]) ...一个字符类,其数字从1到9,括号用于后面的引用。

\1 ...向后引用第一个(在本例中仅限于)括号大小的子表达式。

{5} ..正好(另一次)5次,使它“超过5次”。

每份文件:

反向引用(\n)匹配由数字n指定的前一个括号大小的子表达式匹配的相同字符串。例如,([bc])\1匹配bbcc,但不匹配bccb

演示。

票数 2
EN

Stack Overflow用户

发布于 2014-06-23 11:45:24

好的,这里的逻辑可以概括为:

  • 在任何给定数字中找出同一连续数字的最长序列;以及
  • 如果最长值>5位数,则返回true

对吗?

因此,让我们将其拆分为一系列的连续数字:

代码语言:javascript
复制
regress=> SELECT regexp_matches('666666689', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g');
 regexp_matches 
----------------
 {6666666}
 {8}
 {9}
(3 rows)

然后进行最长的过滤:

代码语言:javascript
复制
regress=> 

SELECT x[1] 
FROM regexp_matches('6666666898', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x 
ORDER BY length(x[1]) DESC 
LIMIT 1;

    x    
---------
 6666666
(1 row)

..。但实际上,我们并不关心这一点,只是如果任何条目大于5位数,所以:

代码语言:javascript
复制
SELECT x[1] 
FROM regexp_matches('6666666898', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x 
WHERE length(x[1]) > 5;

可用作EXISTS测试。

代码语言:javascript
复制
WITH blah(n) AS (VALUES('999999969'),('000000089'),('666666689'),('15552555'))
SELECT n
FROM blah
WHERE EXISTS (
    SELECT x[1] 
    FROM regexp_matches(n, '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g') x 
    WHERE length(x[1]) > 5
)

这实际上是相当有效的,并返回正确的结果(总是很好)。但是,可以通过以下方式来简化它:

代码语言:javascript
复制
WITH blah(n) AS (VALUES('999999969'),('000000089'),('666666689'),('15552555'))
SELECT n
FROM blah
WHERE EXISTS (
    SELECT x[1] 
    FROM regexp_matches(n, '(0{6}|1{6}|2{6}|3{6}|4{6}|5{6}|6{6}|7{6}|8{6}|9{6})', 'g') x;
)

可以在WHERE中使用相同的DELETE子句。

票数 3
EN

Stack Overflow用户

发布于 2014-06-23 10:53:17

在性能方面很糟糕,但它应该能发挥作用:

代码语言:javascript
复制
DELETE FROM YOURTABLE 
 WHERE YOURDATA LIKE '%111111%' 
    OR YOURDATA LIKE '%222222%' 
    OR YOURDATA LIKE '%333333%'
    OR YOURDATA LIKE '%444444%'
    OR YOURDATA LIKE '%555555%'
    OR YOURDATA LIKE '%666666%'
    OR YOURDATA LIKE '%777777%'
    OR YOURDATA LIKE '%888888%'
    OR YOURDATA LIKE '%999999%'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24363986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档