2016-08-21 94 views
0

我一直有一個問題,現在有一段時間,並且找不到適用於我的解決方案。這可能是因爲我沒有正確地做,或者有更好的替代方案。我樂意接受任何想法。MS Access - 基於三列刪除重複項,同時保留一個結果,而不使用SQL最小/最大

我有一個表(tblDocQueue)的訪問,就像下面顯示的那樣。數據來自我們在工作中使用的舊應用程序的數據提取,因此源或提取不能更改。我們將數據上傳到Access以分析和構建指標。表如下:

ID可採用DocName OWNERNAME AccountNum DocRef
1文件1馬特1001 Z0005638
2文件1馬特1002 Z0005638
3文件1託尼5010 Z0005639
4文檔2盧克1050 Z0005640
5文件3盧克1050 Z0005641
6文檔3加里1234 Z0005641
7文檔4約翰8789 Z0005642
8文檔第5版8789 Z0005642
9文件第5版8790 Z0005643
10文件5康尼4579 Z0005644
11文件6瑪麗3616 Z0005645
12文件6露4795 Z0005646
13文件6蒂娜4795 Z0005646
14文件7馬特1001 Z0005638
15文件7約翰8789 Z0005647

列出的列數多於列出的列數,但與問題無關。我試圖刪除重複項,保留一個唯一的值,基於三列(DocName,OwnerName,Doc Ref)。我正在使用以下SQL進行此操作,但它開始花費數小時(最多7小時)來處理大約500,000行數據。我不確定如果效率問題是因爲使用最小值/最大值或其他一些原因

SELECT tblDocQueue.ID AS Expr1, tblDocQueue.DocName AS Expr2, 
    tblDocQueue.OwnerName AS Expr3, tblDocQueue.AcctNo AS Expr4, 
    tblDocQueue.ExpDate AS Expr5, tblDocQueue.EffectiveDate AS Expr6, 
    tblDocQueue.SignatureDate AS Expr7, tblDocQueue.DocBNYSts AS Expr8, 
    tblDocQueue.StsDate AS Expr9, tblDocQueue.UserSts AS Expr10, 
    tblDocQueue.Location AS Expr11, tblDocQueue.Ackngmt AS Expr12, 
    tblDocQueue.OPID AS Expr13, tblDocQueue.Comments AS Expr14, 
    tblDocQueue.DocRef AS Expr15, tblDocQueue.ExternalComment AS Expr16, 
    tblDocQueue.FirstName AS Expr17, tblDocQueue.LastName AS Expr18, 
    tblDocQueue.ClientID AS Expr19, tblDocQueue.Address AS Expr20, 
    tblDocQueue.CountryCode AS Expr21 
FROM tblDocQueue 
WHERE ((([tblDocQueue].[ID])=(
    SELECT Min(t.[ID]) 
    FROM [tblDocQueue] AS t 
    WHERE t.[DocRef]=[tblDocQueue].[DocRef] 
    AND t.[DocName]=[tblDocQueue].[DocName]))); 

,這正在採取是爲創業團隊難以接受的時間。然後,我在VBA中開發了一項工作,使用在Excel中預加載的remove duplicates函數將數據導出到excel文件,並將唯一數據導入到另一個表中。這隻需要幾秒鐘的Excel。隨着這個數據庫的使用開始擴大,我將每天以類似的方式去除重複數百個數據集,我試圖在沒有使用上述解決方法的情況下使用這個工具。

上面的例子中所述的預期結果數據將是:

ID可採用DocName OWNERNAME AccountNum DocRef
1文件1馬特1001 Z0005638
3文件1託尼5010 Z0005639
4文檔2盧克1050 Z0005640
5文件3盧克1050 Z0005641
6文檔3加里1234 Z0005641
7文檔4約翰8789 Z0005642
8文檔第5版8789 Z0005642
9文件第5版8 790 Z0005643
10文件5康尼4579 Z0005644
11文件6瑪麗3616 Z0005645
12文件6露4795 Z0005646
13文件6蒂娜4795 Z0005646
14文件7馬特1001 Z0005638
15文件7約翰8789 Z0005647

如果有人能幫助我與SQL到:

  1. 有條件刪除重複值基於三列
  2. 使用Microsoft Access 2010
  3. 在保持各自的獨特價值
  4. 一行在某種程度上是有效的/不帶長的時間量(表高達5,000,000條記錄)

任何與所有的幫助非常感謝!

回答

0

考慮一個簡單的彙總查詢,在列編組,你需要不同的可採用DocNameOWNERNAMEDocRef。然後,取ID的Min()AccountNum這也將包括所有其它列:

SELECT Min(tblDocQueue.ID) AS MinOfID, 
     tblDocQueue.DocName, 
     tblDocQueue.OwnerName, 
     Min(tblDocQueue.AccountNum) AS MinOfAccountNum, 
     tblDocQueue.DocRef 
FROM tblDocQueue 
GROUP BY tblDocQueue.DocName, 
     tblDocQueue.OwnerName, 
     tblDocQueue.DocRef 
ORDER BY Min(tblDocQueue.ID); 

輸出

MinOfID DocName OwnerName MinOfAccountNum DocRef 
1   Doc 1  Matt  1001   Z0005638 
3   Doc 1  Tony  5010   Z0005639 
4   Doc 2  Luke  1050   Z0005640 
5   Doc 3  Luke  1050   Z0005641 
6   Doc 3  Gary  1234   Z0005641 
7   Doc 4  John  8789   Z0005642 
8   Doc 5  Ed   8789   Z0005642 
9   Doc 5  Ed   8790   Z0005643 
10  Doc 5  Connie  4579   Z0005644 
11  Doc 6  Mary  3616   Z0005645 
12  Doc 6  Lucy  4795   Z0005646 
13  Doc 6  Tina  4795   Z0005646 
14  Doc 7  Matt  1001   Z0005638 
15  Doc 7  John  8789   Z0005647 
相關問題