1


0

私の会社は3つのパートナーと協力しており、各パートナーは複数のブランドを持つことができます。 毎週、私はMySQLデータベースに各ブランドのテーブルと共に保存している各ブランドのユーザーリストのダンプを取得します。 各ブランドには、ユーザーのリストといくつかの基本情報(生年月日、郵便番号、性別)が含まれています。 一部のユーザーは異なるブランドでサインアップでき、各ブランドはユーザーに関する独自のデータセットを持つことができます。

たとえば、ユーザーがCanvasとMNMにサインアップしています。 Canvasでは、そのプロフィールは次のようになります。

IDベンダーの誕生日後の郵便番号の変更94bafdb3e155d30349f1113a25c0714f M 1973 2800 2009-01-01 09:01:01

MNMでは、次のようにします。

IDジェンダーの誕生日のポストコード94bafdb3e155d30349f1113a25c0714f 1973 1000 2009-09-09 09:01:01

最新バージョンのデータを使用して2つのレコードを結合するだけでなく、データの出所を知らせるビュー(またはテーブル - どちらが最適かわかりません)を作成したいと思います。

したがって、上記の2つのレコードは次のように結合されます。

ID GENDER G_DATE G_BRAND BIRTHYEAR B_DATE B_BRANDポストコードP_DATE P_BRAND 94bafdb3e155d30349f1113a25c0714f M 2009-01-01 09:01:01 Canvas 1973 2009-09-09 09:01:01 MNM 1000 2009-09-09 09:01:01

私は、複雑な一連の和集合とサブクエリを想像していますが、どこから始めればいいのかよくわかりません。

すべてのテーブルをマージするビューを作成しました

view_combine AS SELECT ID、GENDER、G_DATEとして変更、B_THANDとして変更、B_DATEとして変更、P_DATEとして変更、P_DATEとして変更、P_BRANDとして変更キャンバスUNION ALL SELECT ID、GENDER 、G_DATEとしての変更、G_BRANDとしての 'Een'、B_DTHとしての変更、B_BRANDとしての 'Een'、P_DATEとしての変更、P_BRANDとしての 'Een'からのすべてのUNION ALL SELECT IDからの変更、GENDER G_BRAND、BIRTHYEAR、B_DATEとしての修正、B_BRANDとしての 'MNM'、P_DATEとしての修正、P_BRANDとしての 'MNM' from mnm

それから選択を実行しようとしていますが、それが正しい方向ではないと思います。

SELECT v1.hashkey、ge.gender、ge.g_date、ge.g_brand、bi.birthyear、bi.b_date、bi.b_brand、pc.postcode、pc.p_date、pc.p_brand FROM view1 v1 JOIN(select g.hashkey、 g.gender、g.g_date、g.g_brand from view1 g左から結合view1 g1 on g.hashkey = g1.hashkeyそしてg.g_date <g1.g_dateどこg1.hashkeyがNULLであるかge ge.HASHKEY = v1.HASHKEY JOIN(view1からb.hashkey、b.birthyear、b.b_date、b.b_brandを選択b b1.hashkey = b1.hashkeyおよびb.b_date <b1.b_date WHERE b1.hashkeyはNULLです)bi ON bi.HASHKEY = v1.HASHKEY JOIN(view1からp.hashkey、p.postcode、p.p_date、p.p_brandを選択p p1 join p1を左にp.hashkey = p1.hashkeyおよびp.p_date <p1.p_date WHERE p1 .hashkeyはNULLです)pc on pc.HASHKEY = v1.HASHKEY GROUP BY v1.hashkey

2 Answer


1


私はこれをどうにか解決しました。 基本的に、ビューを選択してからビューを再選択し、必要なフィールドを取得する必要がありました。 副選択内の日付の順序が必要な値を返すことがわかりました。

SELECT v1.hashkey、ge.gender、ge.g_date、ge.g_brand、bi.birthyear、bi.b_date、bi.b_brand、pc.postcode、pc.p_date、pc.p_brand FROM view_combine v1ジョイン(select g.hashkey、 g.gender、g.g_date、g.g_brand from view_combine g left join view_combine g1 ON g.hashkey = g1.hashkeyかつg.g_date <g1.g_dateであり、g1.genderがNULLではない場合g1.hashkeyはNULL順ではないge.HASHKEY = v1.HASHKEY JOIN(view_combineからb.hashkey、b.b_date、b.b_brandを選択します。b左結合view_combine b1を選択します。b.hashkey = b1.hashkey AND b.b_date < b1.b_dateおよびb1.birthyearがNULLではない場合b1.hashkeyはb.b_dateによるNULL順序)bi ON bi.HASHKEY = v1.HASHKEY JOIN(p.hashkey、p.postcode、p.p_date、p.p_brandから選択) view_combine p left join view_combine p1 ON p.hashkey = p1.hashkeyかつp.p_date <p1.p_dateかつp1.postcodeがNULLではありませんWHERE p1.hashkeyは、p.p_dateによるNULL順序です。グループby v1.hashkey


1


私はあなたが既に解決したことを認識しています、しかし二次的な観点として、これは私が前処理することであるものです。

データが与えられた場合:パートナー1 - UserA、男性、Null、6300、9 / 9/09パートナー2 - UserA、Null、1980年、2300、9 / 10/09

UserAを照会するときは、ほとんどの場合「最新レコード」が必要です。

次の表を使用してください。

パートナー

タイプコードDisplayName

現在の使用者

ユーザーID性別性別SourcePartner BirthYear BirthYearSourcePartner PostalCode PostalCodeSourcePartner

PartnerSourceData

PartnerTypeCodeユーザーID性別出生年月日郵便番号変更日

次に、パートナーのソースファイルを受け取ったら、それを1行ずつ処理して現在のユーザーテーブルを更新し、PartnerSourceDataテーブルに追加します(これをログとして使用します)。