データテーブルの連結ー横方向2(内部結合)


テーブルとテーブルの連結には、縦方向(行が増える)と横方向(列が増える)の場合があります。
縦方向の場合は集合、横方向の場合は結合と言います。

結合には以下のパターンがあります。
 完全外部結合:共通しないレコードをすべて含めて列を増やす。
 右(左)外部結合:右(左)側のテーブルの共通しないレコードを含めて列を増やす。
 内部結合:共通するレコードを対象として列を増やす。

今回は、内部結合について、SAS プログラムと SQL、および Python (Pandas) をそれぞれ用いた例を紹介します。

行いたい操作は下記です。

A列をキーとして、値が一致するレコードのみを取り出して、横方向に連結します。

① SAS プログラムでの内部結合

data table_3;
  merge table_1 (in=flg1)
        table_2 (in=flg2);
  by A;
  if flg1=1 and flg2=1 then output;
run;

merge ステートメントで横に重ねて、 by でキーとなる変数を指定します。
in は、一時変数を指定するオプションです。
具体的には例えば、table_1 ( in =flg1) では、一時変数名をflg1として設定しており、
 ・table_1 由来のレコードでは flg1=1
 ・それ以外では flg1=0
となります。
さらに一時変数として指定した flg1 と flg2 は、出力テーブルには出力されません。

例えば、下記プログラムでは、

data table_4;
  merge table_1 (in=flg1)
        table_2 (in=flg2);
  by A;
 val1=flg1;
 val2=flg2;
run;

出力は下記 table_4 となります。一時変数の値を強制的に表示させるため、val1, val2 でそれぞれ値を引き継がせています。
val1 が table_1 起因、val2 が table_2 起因であることがわかると思います。

改めて下記プログラムに戻ると、

data table_3;
  merge table_1 (in=flg1)
        table_2 (in=flg2);
  by A;
  if flg1=1 and flg2=1 then output;
run;

if flg1=1 and flg2=1 then output; で、flg1 (=val1) と flg2 (=val2) が共に 1 であるレコードを出力 (then output) させることで、内部結合に相当するテーブルが得られます。

② SQL での内部結合

 create table table_3 as
 select table_1.A, table_1.B, table_2.C
 from table_1 inner join table_2 on table_1.A = table_2.A;

SELECT 取り出す変数名 from データセット1 inner join データセット2 on 結合条件
(inner は省略してもOK)
結合したいテーブルどうしを inner join でつなぎ、on 以下でどの列を基準にデータを一致させるかを指定します。

また、inner join ~ on を使わずに、where句を使って次のように記述することもできます。

 create table table_3 as
 select table_1.A, table_1.B, table_2.C 
 from table_1, table_2 where table_1.A = table_2.A;

③ Python (Pandas) での完全外部結合

import pandas as pd
table_1 = pd.DataFrame({'A': [1, 2], 'B': ['AA', 'BB']})
table_2 = pd.DataFrame({'A': [2, 3], 'C': [10, 20]})
table_3 = pd.merge(table_1, table_2, on = "A", how="inner")

.merge で結合、on にキー列を指定、how で様式(内部なので "inner")を指定します。

出力結果

ちなみに how の様式指定では、 "outer" が完全外部結合、"left" ("right") が左 (右) 外部結合となります。

関連記事

データテーブルの連結-縦方向 1(異なる列名をそのまま残す場合)
データテーブルの連結-縦方向 2(異なる列名を統合する場合)
データテーブルの連結-縦方向 3(積集合と差集合)
データテーブルの連結-横方向 1(完全外部結合)
データテーブルの連結-横方向 3(左右の外部結合)
データテーブルの連結ー交差結合