次の構造のテーブルがあります。
WorkerPersons
-------------------------------
ID (PK)
PersonID (Indicates which version of Person the record describes)
SomeColumn1 (data specific to Worker)
SomeColumn2 (data specific to Person)
....
SomeColumnN
-------------------------------
ご覧のとおり、これは非正規化されたテーブルであり、Worker と Person (および 1 つの Person の多くのバージョン) の両方のデータを 1 つのテーブルに保持します。私の願いはそのテーブルを正規化することですが、テーブルには大量のデータ (多数の列) が含まれているため、どの列を Workers テーブルに、どの列を Persons テーブルに移動する必要があるかを確認する必要があります。結果は次のようになります。
Workers Persons
----------------------- ---------------------
ID ID
PersonID (now a FK) PersonColumn1
WorkerColumn1 PersonColumn2
WorkerColumn2 ...
... PersonColumnN
WorkerColumnN
----------------------- ---------------------
そのためには、すべての一意の Person (WorkerPersons の PersonID で区切られている) で Person の範囲が異なるデータを分析する必要があります。例えば:
WorkerPersons
-------------------------------------------------------
ID PersonID Column1 Column2 Column3
-------------------------------------------------------
1 PersonA 10.1 John Doe Single
2 PersonA 10.1 John Doe Single
3 PersonA 10.1 John Doe Married
4 PersonB 09.2 Sully Single
5 PersonB 09.2 Sullivan Single
この場合、PersonA には 3 つのバージョンがあり、PersonB には 2 つのバージョンがあります。Column1 の値は Person のすべてのバージョンで常に同じであり、その列をテーブル Worker に移動できます。ただし、Column 2 と Column3 の値は Person のバージョンが異なると変化するため、これらの値は Person テーブルに移動する必要があります。
想像もつきませんが、このような正規化が必要なテーブルが約 10 個あり、それぞれに約 40 列あります。各テーブルには、約 500k から 5m の行が保持されます。
どの列をどこに移動するかを分析するのに役立つスクリプトが必要です。テーブル全体で一意の Person の範囲で変化するすべての列を出力するスクリプトが必要です。しかし、それを行う方法はわかりません。次の行と比較するためにLAG分析機能を試しましたが、変更された列をどのように出力するかは私にはわかりません。
お知らせ下さい。
よろしくお願いします、 アンドリュー