sql >> Base de Datos >  >> RDS >> PostgreSQL

Eliminación de registros con número que se repite más de 5

Bien, entonces la lógica aquí se puede resumir como:

  • Encuentre la serie más larga del mismo dígito consecutivo en cualquier número dado; y
  • Retorna verdadero si el valor más largo es> 5 dígitos

¿Verdad?

Entonces, dividámoslo en una serie de dígitos consecutivos:

regress=> SELECT regexp_matches('666666689', '(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)', 'g');
 regexp_matches 
----------------
 {6666666}
 {8}
 {9}
(3 rows)

luego filtrar por el más largo:

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)

... pero en realidad, eso no nos importa, solo si alguna entrada tiene más de 5 dígitos, entonces:

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

se puede usar como EXISTS prueba, por ejemplo

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
)

que en realidad es bastante eficiente y devuelve el resultado correcto (siempre agradable). Pero se puede simplificar un poco más con:

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;
)

Puedes usar el mismo WHERE cláusula en un DELETE .