2012-10-12 44 views
4

这里是我的表值。 (7条记录)如何从此表检索DISTINCT值?

SELECT * FROM tbl1 

我无法发布图片,因为我的代表低。所以我在这里链接它 http://i.stack.imgur.com/CFl0u.png

我写了一个查询以避免最后一条记录,但我仍然得到最后一条记录。 (我需要的是DISTINCT电子邮件)

SELECT DISTINCT CandEmail,CandName,EmployerId,ContNum,IsDeleted,CandPortalId FROM tbl1 
WHERE EmployerId = 7 AND IsDeleted = 0 

上面的查询检索依然同7条记录与去年重复的电子邮件记录。

回答

1

如果你不关心你这ContNum,那么你可以将聚合函数周围的区域,然后GROUP BY休息:

SELECT CandEmail, 
    CandName, 
    EmployerId, 
    MIN(ContNum) ContNum, -- or you can use MAX() 
    IsDeleted, 
    CandPortalId 
FROM tbl1 
WHERE EmployerId = 7 
    AND IsDeleted = 0 
GROUP BY CandEmail, 
    CandName, 
    EmployerId, 
    IsDeleted, 
    CandPortalId 

或者像别人指出的那样,除非您确定没有不同的值,否则您应该在其他字段上使用聚合函数这些列:

SELECT CandEmail, 
    min(CandName) CandName, 
    min(EmployerId) EmployerId, 
    MIN(ContNum) ContNum, -- or you can use MAX() 
    min(IsDeleted) IsDeleted, 
    min(CandPortalId) CandPortalId 
FROM tbl1 
WHERE EmployerId = 7 
    AND IsDeleted = 0 
GROUP BY CandEmail 
+1

这不会只是返回不同的电子邮件?它将返回'CandEmail,CandName,CandPortalId'的不同组合(where子句确保只有一个'EmployerId,IsDeleted'匹配) –

+0

@MartinSmith基于数据样本,具有多个值的项目是'ContNum'列,所以放置我放置在领域会导致问题的聚合。 – Taryn

+0

谢谢:)它的工作! –

2

使用group by: -

SELECT CandEmail, MAX(CandName), MAX(EmployerId), MAX(ContNum), MAX(IsDeleted),   MAX(CandPortalId) 
    FROM tbl1 
    WHERE EmployerId = 7 AND IsDeleted = 0 
    GROUP BY CandEmail 
+0

对不起,我需要的所有记录:( –

+0

然后再加入到餐桌这一结果后,但如果任何CantNum或CandPortalId是不同的,你会得到更多的记录 – hagensoft

+0

是Definitley ... :-) –

1
SELECT CandEmail, 
     MAX(CandName), 
     7 [EmployerId], 
     MAX(ContNum), 
     0 [IsDeleted], 
     MAX(CandPortalId) 
FROM tbl1 
WHERE EmployerId = 7 AND IsDeleted = 0 
GROUP BY CandEmail 
+0

+1帮助我。 –

5

您可以使用ROW_NUMBEROVER条款:

WITH CTE AS 
(
    SELECT CandEmail,CandName,EmployerId,ContNum,IsDeleted,CandPortalId 
     , RN = ROW_NUMBER() OVER (PARTITION BY CandEmail ORDER BY ContNum DESC) 
    FROM tbl1 
    WHERE IsDeleted = 0 
) 
SELECT CandEmail,CandName,EmployerId,ContNum,IsDeleted,CandPortalId 
FROM CTE WHERE RN = 1 

OVER Clause (Transact-SQL)

应用 相关的窗函数之前确定一个行集的划分和排序。也就是说,OVER子句 在查询结果 集内定义了一个窗口或用户指定的一组行。窗口函数然后计算 窗口中每行的值。

+0

比'GROUP BY'版本更清洁。 – Taryn

+0

+1帮助我。 –

+0

嗨,我也试过你的查询,它的工作,但记录与IsDeleted = 1获得显示呢?所以在这种情况下,我添加了此语句到最后SELECT CandEmail,CandName,EmployerId,ContNum,IsDeleted,CandPortalId 从CTE WHERE RN = 1 AND IsDeleted = 0。这是正确的吗 ?谢谢 –