基于名称的唯一数据,来自sql server的电子邮件

时间:2016-11-01 07:33:42

标签: sql-server sql-server-2008

我想基于FirstName,EmailID获取唯一行。我通过将DISTINCT添加到仍然获得重复行的所有行来尝试了一些事情。尝试Group By失败并出错。我可以做一个子查询,但这会很慢。 WHat是以下查询的最佳解决方案

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 

2 个答案:

答案 0 :(得分:2)

看看这是否适合你:

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

我在内表中添加了一个额外的列(即NewCol)。我假设你想为“FirstName,Email”的每个组合显示最近的记录(使用CREATEDON)

答案 1 :(得分: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,只返回表Table1tmp的行。表格tmp被定义为来自User的{​​{1}}和EMail的不同组合。

所以会发生什么:您从Table1创建了UserEMail的明确列表。然后,您从Table1中选择Table1User所在的所有条目。