Null Werte jeder Spalte in einem Datensatz zählen

danschna

Benutzer
Beiträge
17
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?
 
Werbung:
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=*#
 
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
 
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?
 
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.
 
Werbung:
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 :)
 
Zurück
Oben