1

我在 SQL 中有一个视图,它汇集了一些我需要消除重复值的数据。我曾尝试使用 DISTINCT 和 GROUP BY,但没有成功。基本上我们所做的是一系列上传的文件,这些文件根据文档类型附加到提供者。当文档经历不同的签名阶段时,他们将上传文档的多个版本。

每次他们上传文档的新阶段时,都会在 UploadedDocuments 表中添加一个新行,RequiredDocumentsID 保持不变,但 UploadedFiles 表中的文件名(以及该表中的 ID 字段)是新的。

从历史上看,这不是问题,因为我们通常一次查找一个提供者的信息——在这种情况下,我们只为每种文档类型获取最新的信息。然而,现在我们有一个正在处理的新页面,它需要一次显示所有的提供程序,但它只需要列出每个一次并且只列出最近的文件名/路径列。

以下是我目前的观点。如前所述,我尝试将第一个值作为“DISTINCT dbo.ReqDocuments.ID”以及进行 GroupBy。这两个都未能消除任何重复。我在考虑嵌入式选择或外部应用,但我的 tSQL 技能还没有达到那个水平。

SELECT dbo.UploadedFiles.FileName, dbo.UploadedFiles.FilePath,     
dbo.ReqDocuments.ProviderID, dbo.Providers.CompanyName, 
dbo.ReqDocuments.ID AS RequiredDocumentID, dbo.UploadedFiles.aDate,    
dbo.UploadedFiles.aUser
FROM  dbo.Providers 
INNER JOIN dbo.ReqDocuments ON dbo.Providers.ID = dbo.ReqDocuments.ProviderID 
INNER JOIN dbo.UploadedFiles ON dbo.ReqDocuments.ID = dbo.UploadedFiles.ReqDocumentsID
WHERE (dbo.ReqDocuments.DocumentID = 50)
4

3 回答 3

1

您可以使用 ROW_NUMBER() 来解决此问题:

SELECT *
FROM (SELECT UploadedFiles.FileName, UploadedFiles.FilePath,    
ReqDocuments.ProviderID, Providers.CompanyName, 
dbo.ReqDocuments.ID AS RequiredDocumentID, dbo.UploadedFiles.aDate,    
dbo.UploadedFiles.aUser
  , ROW_NUMBER () OVER (PARTITION BY  ReqDocuments.ProviderID, Providers.CompanyName, ReqDocuments.ID ORDER BY UploadedFiles.aDate DESC) as RowRank
FROM  dbo.Providers 
INNER JOIN dbo.ReqDocuments ON dbo.Providers.ID = dbo.ReqDocuments.ProviderID 
INNER JOIN dbo.UploadedFiles ON dbo.ReqDocuments.ID = dbo.UploadedFiles.ReqDocumentsID
WHERE (dbo.ReqDocuments.DocumentID = 50)
)sub
WHERE RowRank = 1

PARTITION BY不会随着每次上传而改变的字段,以及ORDER BY降序显示最新的日期。您可以运行内部查询以了解 ROW_NUMBER() 的工作原理。

另外,我喜欢别名,所以这里是:

SELECT *
FROM (SELECT  upl.FILENAME
            , upl.FILEPATH
            , Req.ProviderID
            , prv.CompanyName
            , Req.ID AS RequiredDocumentID
            , upl.aDate
            , upl.aUser
            , ROW_NUMBER () OVER (PARTITION BY  Req.ProviderID, prv.CompanyName, Req.ID ORDER BY upl.aDate DESC) as RowRank
    FROM  Providers prv
    INNER JOIN ReqDocuments Req
            ON prv.ID = Req.ProviderID 
    INNER JOIN UploadedFiles upl
            ON Req.ID = upl.ReqDocumentsID
    WHERE (Req.DocumentID = 50)
    )sub
WHERE RowRank = 1
于 2013-06-21T21:06:13.117 回答
1

简单地说,给定一个 DocumentID,您需要一个 (ProviderID, FilePath) 列表,其中 FilePath 是该 DocumentID 和 ProviderID 组合的最新列表。

我会按 ProviderID 对您的所有 FilePaths 分区进行排名,并按日期排序:

SELECT outerF.FileName, outerF.FilePath,     
    outerD.ProviderID, outerP.CompanyName, 
    outerD.ID AS RequiredDocumentID, outerF.aDate,    
    outerF.aUser
FROM  dbo.Providers outerP
INNER JOIN dbo.ReqDocuments outerD ON outerP.ID = outerD.ProviderID 
INNER JOIN dbo.UploadedFiles outerF ON outerD.ID = outerF.ReqDocumentsID
WHERE (outerD.DocumentID = 50)
AND outerF.aDate = (
    SELECT top 1 innerF.aDate
    FROM  dbo.ReqDocuments innerD
    INNER JOIN dbo.UploadedFiles innerF ON innerD.ID = innerF.ReqDocumentsID
    WHERE innerD.ProviderID = outerP.id
    AND innerD.DocumentID = outerD.DocumentID
    ORDER BY innerF.aDate DESC)
于 2013-06-21T21:09:58.267 回答
0

此查询查找重复项

 SELECT t1.ID  FROM Table t1,Table t2  where  t1.Name=t2.Name and t1.ID>t2.ID
于 2013-06-22T17:02:07.597 回答