1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-02-20

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

結合には以下のパターンがあります。
 完全外部結合:共通しないレコードをすべて含めて列を増やす。
 右(左)外部結合:右(左)側のテーブルの共通しないレコードを含めて列を増やす。
 内部結合:共通するレコードを対象として列を増やす。
image.png
今回は、__内部結合__について、SAS プログラムと SQL、および Python (Pandas) をそれぞれ用いた例を紹介します。

行いたい操作は下記です。
image.png
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 起因であることがわかると思います。
image.png

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

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) させることで、内部結合に相当するテーブルが得られます。
image.png

####② 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 以下でどの列を基準にデータを一致させるかを指定します。
image.png
また、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")を指定します。

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

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?