1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Null Werte jeder Spalte in einem Datensatz zählen

Dieses Thema im Forum "PostgreSQL" wurde erstellt von danschna, 6 Juni 2018.

  1. danschna

    danschna Benutzer

    Hallo zusammen,

    ich möchte gerne, auch um die Datenqualität bestimmen zu können eine Abfrage generieren, die zählt, wieviel NULL-Werte in den jeweiligen Spalten vorkommen.
    Wie ich das in einer einzelnen Spalte mache ist mir bekannt, aber wir haben Tabellen mit teilweise über 100 Attributen und ich suche noch nach einer schlanken Variante, die ich am besten auf verschiedene Tabellen anwenden kann, dazu. Gibt's da was?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Reichen Schhätzwerte?

    Code:
    test=# create table danschna (a int, b int, c int, d int);
    CREATE TABLE
    test=*# insert into danschna select case when random() < 0.2 then null else random()*1000 end, case when random() < 0.4 then null else random()*1000 end, case when random() < 0.6 then null else random()*1000 end, case when random() < 0.8 then null else random()*1000 end from generate_series(1,100000) s;
    INSERT 0 100000
    test=*#
    test=*#
    test=*# commit;
    COMMIT
    test=# analyse danschna;
    ANALYZE
    test=*# commit;
    COMMIT
    test=# select attname, null_frac from pg_stats where tablename = 'danschna';
     attname | null_frac
    ---------+-----------
     a       |    0.2003
     b       |    0.3948
     c       |    0.5975
     d       |  0.797767
    (4 Zeilen)
    
    test=*#
    
     
  3. danschna

    danschna Benutzer

    Ich verstehe die Lösung ehrlich gesagt gerade nicht. Stehe wohl auf dem Schlauch,
    Ich hätte gerne folgendes:

    a | b | c |
    1 2 1
    null 1 null
    null 3 4

    Rauskommen soll:

    Select Count(*) "über alle Attribute" where spalteninhalt = null

    Rauskommen sollte dann:
    a=2; b=0; c=1
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Ja, das was Du willst geht aber so nicht, da wirst Du alle Spalten separat nennen müssen und aggregieren müssen. Mit etwas Fleiß könnte man solch eine Abfrage auch dynamisch generieren.

    Was ich gemacht habe ist einfach nur, daß ich die internen Statistiken, die PostgreSQL sowieso führt (dazu zählt auch der Anteil der NULL-Werte je Spalte) abgefragt habe. Das sind Schätzwerte, aber um die "Datenqualität" bestimmen zu können sollte das reichen, oder?
     
    danschna gefällt das.
  5. akretschmer

    akretschmer Datenbank-Guru

    vielleicht sollte ich noch ergänzen:

    • ich habe eine Tabelle mit den 4 Spalten a,b,c und d erstellt, INTEGER
    • dann habe ich diese Tabelle gefüllt, Für z.B. a, wenn random() kleiner 0.2 ist mit NULL sonst mit einem zufälligen INT-Wert. Das sollte mit ca. 20% Wahrscheinlichkeit. Bei b wieder, nur NULL wenn random() < 0.4 ist, das erfolgt mit 40% Wahrscheinlichkeit. Und so weiter für c und d mit 0.6 und 0.8. Ich habe 100000 solcher Zeilen generiert
    • via analyse die Statistiken für diese Tabelle erzeugt/aktualisiert
    • dann die Statistiken abgefragt, null_frac gibt den Anteil der NULLen dieser Spalte an, zwischen 0 und 1. Also mal 100 rechnen, dann hast Du die prozentuale Wahrscheinlichkeit.

    Die ersten 10 Zeilen der Tabelle sind übrigens:

    Code:
    test=*# select * from danschna limit 10;
      a  |  b  |  c  |  d  
    -----+-----+-----+-----
     594 | 597 |     |   
     149 |     | 531 |   
         | 600 |     |   
     297 |     | 396 |   
     332 |     | 398 | 348
     576 |  71 |     |   
         | 484 |     |   
         | 293 | 522 |   
     311 | 645 |     |   
     460 |     | 439 |   
    (10 Zeilen)
    
    PostgreSQL nutzt intern diese Statistiken, um seine Abfragepläne zu optimieren.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Hast Du Dein Ziel nun eigentlich erreicht?
     
  7. danschna

    danschna Benutzer

    Hallo akretschmer,

    das war auf jeden Fall die richtige Lösung für mein Problem, vielen Dank. Habe die pg_stats noch nicht gekannt und lese mich gerade über weitere Möglichkeiten ein. Super Sache :)
     
    akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden