7

分析を行っているデータセットがあります。分析結果を大幅に改善する人口統計データとコミュニティ データで簡単に強化できることがわかりました。

これを行うために、分析を行う前に人口統計データとコミュニティ データに参加しています。コア サンプル セットからいくつかのフィールドを除外する必要があるため、結合は次のようになります。

select sampledata.c1, 
       sampledata.c2, 
       demographics.*, 
       community.* 
from sample data 
    join demographics using (zip) 
    join community using (fips)

これにより、分析エンジンが処理できない出力に複数の zip または fips 列が表示されます。各フィールドを手動で指定することはできません。エンリッチメント テーブルは最終的に何百もの列になります。

* を選択することもできますが、サンプル データの不要な列がすべて含まれてしまいます。

サンプル テーブルから必要な列を選択しながら、フィールドを複製せずにエンリッチメント データに結合するにはどうすればよいですか?

私が考えていたことの 1 つは、postgres (私のデータベース) が出力の各列 (sample.c1、demographics.c1 など) を完全に修飾できれば、私はこれに完全に満足するだろうということでした。

4

1 に答える 1

2

SQLには列除外構文はなく、列包含構文のみがあります(すべての列に対して*演算子を使用するか、列名を明示的にリストします)。

必要な列のみのリストを生成する

ただし、スキーマテーブルとデータベースのいくつかの組み込み関数を使用して、数百の列名から不要な重複列を除いたSQLステートメントを生成できます。

SELECT
    'SELECT sampledata.c1, sampledata.c2, ' || ARRAY_TO_STRING(ARRAY(
        SELECT 'demographics' || '.' || column_name
        FROM information_schema.columns
        WHERE table_name = 'demographics' 
        AND column_name NOT IN ('zip')
        UNION ALL
        SELECT 'community' || '.' || column_name
        FROM information_schema.columns
        WHERE table_name = 'community' 
        AND column_name NOT IN ('fips')
    ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement

これはステートメントを出力するだけで、実行はしません。次に、結果をコピーして実行します。

ステートメントの生成と動的な実行の両方を一度に実行したい場合は、PostgreSQLのドキュメントで動的SQLを実行する方法を確認できます。

列名の前にテーブル名を付ける

または、重複データを含むすべての列の選択リストを生成しますが、各列のテーブル名も含めるようにエイリアスを作成します。

SELECT
    'SELECT ' || ARRAY_TO_STRING(ARRAY(
        SELECT table_name || '.' || column_name || ' AS ' || table_name || '_' || column_name
        FROM information_schema.columns
        WHERE table_name in ('sampledata', 'demographics', 'community')
    ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement

繰り返しますが、これはステートメントを生成するだけです。ステートメントの生成と動的な実行の両方を行う場合は、データベースの動的SQL実行をブラッシュアップする必要があります。それ以外の場合は、結果をコピーして実行するだけです。

列エイリアスにドット区切り文字が本当に必要な場合は、などの二重引用符で囲まれたエイリアスを使用する必要がありますSELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"'。ただし、二重引用符で囲まれたエイリアスは、余分な問題(大文字と小文字の区別など)を引き起こす可能性があります。そのため、代わりにアンダースコア文字を使用して、エイリアス内の列名からテーブル名を分離しました。そうしないと、エイリアスを通常の列名のように扱うことができます。

于 2013-02-25T08:36:51.853 に答える