0

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

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

ID DocName OwnerName AccountNum DocRef
1 Doc 1 Matt 1001 Z0005638
2 Doc 1 Matt 1002 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 文档 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])));

它所花费的时间对于业务团队来说是不可接受的。然后,我在 VBA 中开发了一种解决方法,使用 excel 中预加载的删除重复项功能将数据导出到 excel 文件,并将唯一数据导入回不同的表中。这在 excel 中只需要几秒钟。随着该数据库的使用开始扩大,并且我将每天以类似的方式删除数百个数据集的重复项,我试图在不使用上述解决方法的情况下使其工作。

上述示例数据的预期结果将是:

ID DocName OwnerName AccountNum 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 Z0005638 Z0005638 91056
Doc

如果有人可以用 SQL 帮助我:

  1. 基于三列有条件地删除重复值
  2. 使用 Microsoft Access 2010
  3. 同时保留每个唯一值的一行
  4. 以某种高效/不需要很长时间的方式(表多达 5,000,000 条记录)

非常感谢任何和所有帮助!

4

1 回答 1

1

考虑一个简单的聚合查询,按您需要不同的DocNameOwnerNameDocRef的列分组。然后,获取Min()IDAccountNum 其中还包括所有其他列:

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
于 2016-08-21T03:14:38.077 回答