MS Access - 根据三列删除重复项,同时保留一个结果而不使用 SQL Min/Max

MS Access - Remove duplicates based on three columns while keeping one result without using SQL Min/Max

我遇到一个问题已经有一段时间了,找不到适合我的解决方案。可能是我没有正确地做,或者有一个更好的选择。我乐于接受并感激任何想法。

我在访问中有一个 table (tblDocQueue),如下所示。数据来自我们在工作中使用的旧应用程序的数据提取,因此无法更改源或提取。我们将数据上传到 Access 以对其进行分析和构建指标。 table如下:

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 行数据。我不确定效率问题是因为使用 min/max 还是其他原因

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])));

它所花费的时间对于业务团队来说是不可接受的table。然后我在 VBA 中开发了一个变通方法,将数据导出到 excel 文件,使用 excel 中预加载的删除重复项功能,并将唯一数据导入回不同的 [=78] =].这只需要几秒钟 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 版 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

如果有人能帮我 SQL 到:

  1. 根据三列条件删除重复值
  2. 使用 Microsoft Access 2010
  3. 同时保留每个唯一值的一行
  4. 在某种程度上是高效的/不需要很长时间(table最多 5,000,000 条记录)

非常感谢任何帮助!

考虑一个简单的聚合查询,根据您需要不同的列分组 DocNameOwnerNameDocRef。然后,取 IDAccountNumMin(),这也将包括所有其他列:

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