PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Usuwanie rekordów o numerze powtarzającym się więcej niż 5

OK, więc logikę można podsumować jako:

  • Znajdź najdłuższą serię tej samej kolejnej cyfry w dowolnej podanej liczbie; i
  • Zwróć prawdę, jeśli najdłuższa wartość ma> 5 cyfr

Prawda?

Więc podzielmy to na ciągi kolejnych cyfr:

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

następnie filtruj najdłużej:

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)

... ale tak naprawdę nie obchodzi nas to, tylko jeśli jakikolwiek wpis jest dłuższy niż 5 cyfr, więc:

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

może być używany jako EXISTS test, np.

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
)

co w rzeczywistości jest dość wydajne i zwraca poprawny wynik (zawsze ładny). Ale można to nieco uprościć za pomocą:

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

Możesz użyć tego samego WHERE klauzula w DELETE .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zainstalować Haproxy i Keepalived

  2. Identyfikator kolumny Doctrine nie istnieje w PostgreSQL

  3. Postgresql:Oblicz pozycję według liczby prawdziwych klauzul OR

  4. Lista wszystkich kluczy obcych PostgreSQL

  5. Docker, zainstaluj postgresql w kontenerze zawierającym ubuntu:14.04, utracone po wyjęciu z kontenera