2016-11-01 3 views
0

FirstName、EmailIDに基づいて一意の行を取得したい。 DISTINCTをすべての行に追加して、重複行を取得することで、いくつか試してみました。エラーで失敗したGroup Byを試しました。サブクエリはできますが、それは遅くなります。あなたがテーブルからすべてフィールドをしたいと何が、あなたのケースでは動作しませんクエリ名前に基づくユニークなデータ、SQLサーバーからのメール

以下
SELECT FirstName,LastName,FamilyName, EmailID,Phone,City,Country,CreatedOn,t.Type , ID 
FROM Forms C JOIN Form_Type T 
ON c.Form_TypeID = t.Form_TypeID 
WHERE c.Form_TypeID = 1 AND DATEDIFF("d", CreatedOn, GETDATE()) < 31 
ORDER BY CreatedOn DESC 

答えて

1

DISTINCTための最適なソリューションです。したがって、サブクエリを使用して別名/電子メールのリストを作成する必要があります。

あなたのニーズに次の例を適応させることができる必要があります:

SELECT User, EMail, Address1, Address2 
FROM Table1 t1 
INNER JOIN (SELECT DISTINCT(User, EMail) FROM Table1) tmp ON t1.User = tmp.User AND t1.EMail = tmp.EMail 

INNER JOINこれを使用してテーブルtmpであるTable1からの行だけを返します。表tmpは、UserEMailとの別個の組み合わせとして定義され、Table1からのものである。

これはどういう意味ですか:UserEMailという別個のリストをTable1から作成します。次に、Table1からすべてのエントリを選択します。UserEMailがそのリストにあります。私は内部表に余分な列(すなわち、ニューコール)を追加した

SELECT * 
FROM (
    SELECT FirstName,LastName,FamilyName, EmailID,Phone,City,Country,CreatedOn,t.Type , ID, 
      ROW_NUMBER() OVER (PARTITION BY FirstName ,EmailID ORDER BY CreatedOn DESC) NewCol 
    FROM Forms C 
    JOIN Form_Type T ON c.Form_TypeID = t.Form_TypeID 
    WHERE c.Form_TypeID = 1 
     AND DATEDIFF("d", CreatedOn, GETDATE()) < 31 
    ) t 
WHERE NewCol = 1 

:これはあなたのために働く場合

+0

それでもデータは重複しています。 – Learning

+0

CTEが解決策かもしれません – Learning

+0

@Learning同じファーストネームとメールアドレスを持つ複数のレコードを持っていないことは確かですか?その場合:一意性はどのように定義する必要がありますか?どのレコードを返す必要がありますか? –

2

を参照してください。 "FirstName、Email"の組み合わせごとに最新のレコード(CREATEDONを使用)を表示したいと仮定しています。

+0

レコードを取得しません – Learning

+0

内部クエリを実行して結果が得られているかどうか確認できますか?出力のサンプルを与える? (ファーストネーム、電子メールID、NewCol値のみを心配しています) – Nayak

関連する問題