2

フォークされた独自の mpp データベースを使用していますpsql 8.3。幅の広いテーブル (約 450 列) に単純なカウントを適用しようとしているので、単純な sql 関数に関してこれを行う最善の方法があるかどうか疑問に思っていました。特定の列の個別の値の数と、列の null 値の数を数えているだけです。すべての列に対して一般化したいクエリは、たとえば

列名に対してクエリを実行したい場合は、書き込みます

select
count(distinct names) d_names,
sum(case when names is not null then 1 else 0 end) n_s_ip
from table; 

上記のクエリを一般化して、列の数が 450 の場合、各列名を手動で書き出さずにテーブル内のすべての列を反復処理するにはどうすればよいですか?

4

2 に答える 2

3

まず、COUNT()null 以外の値のみをカウントするため、クエリを簡略化できます。

SELECT count(DISTINCT names) AS unique_names
      ,count(names) AS names_not_null
FROM   table;

しかし、それはnull以外の値の数であり、あなたの説明と矛盾しています:

列内の null 値の数のカウント

そのためには、次を使用します。

count(*) - count(names) AS names_null

すべての行をcount(*)数え、null 以外の行のみを数えます。@Andriy によるヒントの後、下位の代替案を削除しました。count(names)names

すべての列に対してそれを自動化するには、カタログ テーブルから動的にSQL ステートメントを作成します。PL/pgSQL関数で使用して、すぐに実行できます。これらの密接に関連する質問の下で、マニュアルと説明へのリンクを含む完全なコード例を見つけてください。pg_attributeEXECUTE

于 2013-01-14T06:14:40.567 に答える
2

を使用して、クエリの繰り返し部分を生成できますinformation_scheam.columns

select 'count(distinct '||column_name||') d_names, sum(case when '||column_name||' is not null then 1 else 0 end) n_s_ip,' 
from information_schema.columns where table_name='table'
order by ordinal_position;

上記のクエリは、の各列に対してcount(...)とを生成します。この結果は、クエリの選択リストとして使用できます。結果を次のクエリにカット アンド ペーストできます。sum(...)table

select 
-- paste here
from table;

貼り付け後、最後のコンマを削除する必要があります。

このようにしてselect-list、450 列の書き込みを回避できます。

于 2013-01-14T06:18:21.937 に答える