複数システムのそれぞれ独自のユーザーIDに対して、同一ユーザーのIDを紐付けるためのユニークIDを振りたいと考えています。
SQLでどのようなロジックにすれば良いか、頭を悩ませておりまして、助言いただけませんでしょうか。
同一ユーザーを紐付けたテーブルはあります。これを元に「同一ユーザーを区別するための」ユニークIDを振りたいです。
複数システムの同一ユーザーを紐付けるため、3システム以上にまたがるユーザーに、同一IDを振る点が難しいです。。。
・処理はSQLで実行します。(BigQueryのため、ある程度重い処理になっても問題はありません。なお、標準のSQLとほぼ同じなので、標準のSQLで考えていただいて大丈夫です)
・SQLの実行自体は別のプログラムで行うため、複数SQLを順序立てて実行することが可能です。ただしデータ件数が多いため、プログラム側にSELECTでデータを取ってきて処理を行うことは難しいです。(システムID一覧であれば件数が小さいので取得可能です)
・対象のシステムは百近くあるため、「まず2つのシステム分のデータだけを抜き出して紐付けをして・・・」の繰り返しだと5千ループくらい必要なため厳しいです。
(ループがどうしても必要なら、せめてシステムの数=百回ですむようにしたい)
・2つのシステムで、ユーザーは1対1で紐付きます。(紐付かないユーザーもありますが、1対多はありません)
・列[システムID1]と[システムID2]の値は、文字列で見た時に[システムID1]<[システムID2]となっています(つまり、2つのシステムがあった時、どちらが[システムID1][システムID2]になるかは決まっている)
・BigQueryの特性上、UPDATE文、INSERT文、DELETE文は制限されており、使用は避けたいです
・中間テーブルの作成は可能です
・window関数も使用できます
・全てのひも付きが元デーブルに存在するわけではなく、複数行をたどって分かるひも付きもあります
(下の例でいうと、3行目と5行目からA005=B021、B021=C101と分かりますが、A005=C101となる行は元テーブルにはありません) ※追記しました
元テーブルの列
[システムID1,ユーザーID1,システムID2,ユーザーID2]
元テーブルの値の例 ※行は何千万とあります
sys01, A001, sys02, B002
sys01, A003, sys02, B011
sys01, A005, sys02, B021
sys02, B001, sys03, C050
sys02, B021, sys03, C101
sys01, A001, sys03, C102
sys01, A003, sys03, C111
↑たとえば、A005=B021=C101なので、この3つには同じユニークIDを振りたい
作りたいテーブル
[システムID,ユーザーID, ユニークID]
sys01, A001, 0001
sys01, A003, 0002
sys01, A005, 0003
sys02, B002, 0001
sys02, B001, 0004
sys02, B011, 0002
sys02, B021, 0005
sys03, C101, 0003
・・・
どうぞよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー