2012-10-12 26 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。這是正確的嗎 ?謝謝 –