2016-09-09 6 views
1

私は、43列のユーザー情報(名、姓、住所、市区町村、州、郵便番号、電話番号、メールアドレス、訪問日、lastActiveなど)ユーザー情報ビット付き履歴SQLテーブル - 1エントリおよびすべての情報で新しいテーブルを作成

毎晩、私はその日に訪問した顧客からのフィードをクライアントから入手しています。これらの訪問は、古いレコードを削除せずにcustomersテーブルに格納されます。古いレコードはlastActive = 0とマークされ、新しいレコードはlastActive = 1とマークされます。nullフィールドはすべて「不明」として格納されます。

明らかに、これはクエリに時間がかかる非常に大きなテーブルになります。だから、私は別のユーザーとその最も完全な情報だけである新しいテーブルを作ることを計画しています。

例:ボブ・スミスが1月1日に電話または電子メールなしでインポートされ、電話で8月1日に再びインポートされたが、電子メールなしで9月1日に電話なしで再びインポートされた

CustImportID CustomerKey FirstName LastName Phone  Email visitDate lastActive 
1    1   Bob  Smith  Unknown Unknown 2016-01-01 0 
2    1   Bob  Smith  5551231234 Unknown 2016-08-01 0 
3    1   Bob  Smith  Unknown [email protected] 2016-09-01 1 

だから私の質問はこれです、顧客テーブルからの異なる人々を取得するための最良の方法は何だ、とどこボブは唯一の希望、新しいテーブルにそれらを挿入します。電子メール、私の顧客のテーブルには、次のようになります1つのエントリーになりますが、私はすべてのフィールドの値を持っています(すべてのエントリーが電話を持っている場合、たとえば、最新のエントリーから電話を引き出す場合)、

CustomerKey FirstName LastName Phone  Email visitDate 
1   Bob  Smith  5551231234 [email protected] 2016-09-01 
+0

私はそれを行うと考えることができる唯一の方法は、それを行う最良の方法ではない明らかに43のサブクエリを含むクエリを持つことです。私は良い方法がなければならないことを知っていますが、私はそれを考えることができません。 – Brds

答えて

1

SELECT FirstName, LastName, 
     FIRST_VALUE(Phone) OVER (ORDER BY CASE 
              WHEN Phone='Unknown' THEN 1 
              ELSE 0 
             END, 
             visitDate DESC) AS Phone, 
     FIRST_VALUE(Email) OVER (ORDER BY CASE 
              WHEN Email='Unknown' THEN 1 
              ELSE 0 
             END, 
             visitDate DESC) AS Email 
FROM mytable 

:あなたは'Uknown'値を無視するトリックでFIRST_VALUEを使用することができます

10はSQL Server 2012から入手できます。OVER句のORDER BYで指定されている最新のフィールド値が選択されます。 ORDER BY句にCASEがあるため、'Unknown'の値の優先度は最も低くなります。

0

あなたはこの結果であろうすべてのレコードからの値の最大値を使用することができます:あなたは、最近の値に基づいて、ROW_NUMBERとその選択最大をより有効なエントリを使用している2つを持っている場合は

select customerkey, max(firstname), max(lastname), max(phone), max(email), max(visitdate) from yourtablename 

+0

私は行番号について考えていましたが、その後すべてのフィールドに行番号を付ける必要がありました。 – Brds

関連する問題