web-dev-qa-db-ja.com

A COLUMNのみの個別の値に基づいて行を選択する方法

行を返すためにテーブルをクエリする必要がありますが、テーブルを正しくクエリすることができません。これが私のテーブルビューです。

Id                MailId          EmailAddress          Name
1                 1               [email protected]               Mr. A
2                 1               [email protected]               Mr. B
3                 1               [email protected]               Mr. C
4                 1               [email protected]               Mr. D
5                 1               [email protected]               Mr. A
6                 2               [email protected]               Mr. E
7                 2               [email protected]               Mr. A
8                 3               [email protected]               Mr. F
9                 4               [email protected]               Mr. D  
10                5               [email protected]               Mr. F
11                6               [email protected]               Mr. D

結果セットは以下を返します。

Id                MailId          EmailAddress          Name
1                 1               [email protected]               Mr. A
2                 1               [email protected]               Mr. B
3                 1               [email protected]               Mr. C
4                 1               [email protected]               Mr. D
6                 2               [email protected]               Mr. E
8                 3               [email protected]               Mr. F

言い換えると、まず、個別の電子メールアドレスを選択してから、個別の電子メールアドレスを含む行を返します。

注:「個別」キーワードを使用するだけでは、個別の行を選択するため、ここでは機能しません。私の要件は、個別の電子メールアドレスを選択し、それらのアドレスを含む行を選択することです。

編集:「Group By」キーワードも使用できません。これにはId(PK)でグループ化する必要があり、これを行うと同じEmailAddress値を持つ2行が返されるためですただし、異なるIDを使用します。

27
user576510

出力を見て、次のクエリが機能する可能性があるので、試してみてください。

SELECT * FROM tablename
WHERE id IN
(SELECT MIN(id) FROM tablename GROUP BY EmailAddress)

これにより、個別の電子メールアドレスごとに1行のみが選択されます。結果として表示されるのは、idが最小の行です。

56
danishgoel

これを試してください-個別の電子メールアドレスでデータをパーティション化(グループ化)し、IDで各グループを並べ替えるCTE(共通テーブル式)が必要です。次に、各グループの最初のエントリを選択するだけで、探しているものが得られます。

;WITH DistinctMails AS
(
    SELECT ID, MailID, EMailAddress, NAME,
        ROW_NUMBER() OVER(PARTITION BY EMailAddress ORDER BY ID) AS 'RowNum'
    FROM dbo.YourMailTable
)
SELECT *
FROM DistinctMails
WHERE RowNum = 1

これはSQL Serverで動作します2005以降(使用しているものは言及していませんversion使用しています...)

16
marc_s

これを使用します(テーブル名がメールであると仮定します):

select * from emails as a 
inner join  
(select EmailAddress, min(Id) as id from emails 
group by EmailAddress ) as b 
on a.EmailAddress = b.EmailAddress 
and a.Id = b.id

この助けを願っています。

2
Setmax

DBMSについてはわかりません。そのため、Redshiftで一時テーブルを作成しましたが、私の経験から、このクエリは探しているものを返すはずです。

select min(Id), distinct MailId, EmailAddress, Name
    from yourTableName
    group by MailId, EmailAddress, Name

GROUP BY clauseを使用していることがわかりますが、特定のMailIdに対して2つの行はまだありません。

0