我想基于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
答案 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
,只返回表Table1
中tmp
的行。表格tmp
被定义为来自User
的{{1}}和EMail
的不同组合。
所以会发生什么:您从Table1
创建了User
和EMail
的明确列表。然后,您从Table1
中选择Table1
和User
所在的所有条目。