4

这是我的表值。( 7 条记录 )

SELECT * FROM tbl1

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

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

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

上面的查询仍然检索到与最后一个重复电子邮件记录相同的 7 条记录。

4

4 回答 4

5

您可以使用ROW_NUMBERwithOVER子句:

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 子句 (Transact-SQL)

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

于 2012-10-12T21:58:53.387 回答
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
于 2012-10-12T21:57:38.333 回答
1
SELECT CandEmail, 
       MAX(CandName), 
       7 [EmployerId], 
       MAX(ContNum), 
       0 [IsDeleted], 
       MAX(CandPortalId)
FROM   tbl1
WHERE  EmployerId = 7 AND IsDeleted = 0
GROUP BY CandEmail
于 2012-10-12T21:58:26.850 回答
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
于 2012-10-12T21:58:33.207 回答