2017-11-28 4 views
0

Ich möchte zwei Tabellen als Teil eines Datenqualitätsberichts vergleichen. Das Ergebnis sollte drei Spalten Zusammenfassung der Spalte column_x in den Tabellen sein TABLE_A und Table_B:Anzahl der verschiedenen Werte auswählen, die nicht in einem anderen Bereich enthalten sind

  1. Prozent der column_x Werte in TABLE_A die
  2. Anzahl unterschiedlicher Werte in TABLE_A
  3. Anzahl unterschiedlicher Werte nicht leer sind TABLE_A die

Spalten 1 und 2 nicht in Table_B sind einfach einzurichten:

select 
sum(CASE WHEN column_x = '' THEN 0 ELSE 1 END)/count(*) AS percent_complete_in_a, -- column 1 
count(DISTINCT column_x) AS distinct_values_A -- column 2 
from table_A 

Aber ich kann nicht herausfinden, wie ich meine Abfrage schreiben soll, damit Spalte 3 in denselben Ergebnissen erscheinen kann. Ich habe ein paar Variationen auf der folgenden versucht, aber jeder wirft einen Syntaxfehler in Postgres:

select 
sum(CASE WHEN column_x = '' THEN 0 ELSE 1 END)/count(column_x) AS percent_complete_in_a, -- column 1 
count(DISTINCT column_x) AS distinct_values_A, -- column 2 
count(DISTINCT column_x where column_x not in (select DISTINCT column_x FROM table_b)) as distinct_values_A_except_B -- column 3 
from table_a 

Gibt es eine Möglichkeit, diese Abfrage zu strukturieren, um es alle drei Spalten zeigen lassen?

Antwort

1

Ich glaube, es wird helfen, einen linken Join dafür zu verwenden. Hinweis zu vermeiden, dass die Zählung verändert die ich verwendet habe eine "select distinct" Unterabfrage, die alle Zeilen aus TABLE_A nicht vermehren soll:

SELECT 
     SUM(CASE WHEN a.column_x = '' OR a.column_x IS NULL 
       THEN 0 ELSE 1 END)/(COUNT(*) * 1.0)     AS percent_complete_in_a 
    , COUNT(DISTINCT a.column_x)          AS distinct_values_a 
    , COUNT(DISTINCT case when b.column_x IS NULL then a.column_x end) AS distinct_values_A_except_B 
FROM table_a a 
LEFT JOIN (
     SELECT DISTINCT column_x FROM table_b 
    ) b ON a.column_x = b.column_x 
; 

Änderungen:

  • IS NULL in Expression ersten Fall
  • hinzugefügt * 1.0 hinzugefügt so können Sie ein Dezimal-Ergebnis für Prozent erhalten
  • links verbinden und durch Groß-/Kleinschreibung Ausdruck
0

Ich würde dies mit einer Unterabfrage tun:

select avg((column_x <> '')::float) as ratio_complete, 
     count(distinct column_x) as distinct_values_A, -- column 2 
     (count(distinct column_x) - 
     (select count(distinct b.column_x) 
     from table_b b 
     where b.column_x = a.column_x 
     ) 
     ) as distinct_a_not_in_b 
from table_A a; 
Verwandte Themen