2017-11-28 7 views
0

データ品質レポートの一部として2つの表を比較したいと思います。空白でないtable_aでcolumn_x値の別の選択肢にない個別の値の数の選択

  1. パーセント
  2. における異なる値のtable_a
  3. 数の別個の値の数:結果は表table_aとtable_bの列column_xをまとめた3つの列でなければなりませんtable_bにないtable_aは

列1及び2は、セットアップが簡単です:

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 

しかし、カラム3が同じ結果に現れるようにクエリを書く方法を理解することはできません。私は、次のようにいくつかのバリエーションを試してみたが、それぞれが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 

は、それがすべての3つの列を表示するには、このクエリを構築する方法はありますか?

答えて

1

私は、これに左結合を使用すると助けになると思います。私はtable_aから任意の行を掛けるべきではありません「SELECT DISTINCT」サブクエリを使用している数を変更することを避けるために注意してください:

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 
; 

変更:

  • は、最初のcase式
  • IS NULLを追加* 1.0を追加しましたしたがって、パーセントの小数点以下の結果を得ることができます。
  • 左辺の結合とケース式の計算
0

サブクエリでこれを行う:

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;