我正在尝试重命名具有300,000行的EDM系统的表中的重复文件。我遇到的问题是,数百个文件夹中有成千上万个重复的文件名,每个文件夹都有一个文件的多个版本。我需要创建唯一的文件名以导入到新系统中,因此我要根据文件名和文件夹位置在文件扩展名-1,-2,-3等之前附加。
我想在第一个文件夹中将文件名的初始实例及其所有版本附加为“ -1”,在另一个文件夹中将文件名的第二实例及其所有版本附加为“ -2”。我有文件ID,可以将其用作发布附加文件的排序顺序,但顺序确实无关紧要。我提供了当前表结果的示例,以及嵌套在其中的所需结果。
到目前为止,我想出的是:
With DuplicateFileName As
(
Select FolderID, FileName
, Row_Number() Over ( Partition By Filename Order By FolderID ) As Rnk
From NewFilename
)
Update NewFilename
Set FileModifier = Case
When Rnk > 1 Then '-' + Cast(Rnk As varchar(10))
Else ''
End
From NewFilename As T
Join DuplicateFileName As D
On D.FolderID = T.FolderID
下面是一个文件名的示例。它已经接近了,但是无论尝试什么,我都无法像我需要的那样完全添加它。我已经接近了,但似乎无法完美实现。
FolderID FileID FileName Version Current Desired
3506 16875 Gadget.XLSX 1 -1
3506 16876 Gadget.XLSX 2 -1
3506 16877 Gadget.DOCX 1 -1
3506 16878 Gadget.DOCX 2 -1
3522 17578 Gadget.XLSX 1 -3 -2
3522 17579 Gadget.DOCX 1 -3 -2
3525 17602 Gadget.XLSX 1 -4 -3
3525 17603 Gadget.DOCX 1 -4 -3
您需要使用DENSE_RANK()而不是ROW_NUMBER(),因为同一文件夹中的相同文件名可以具有相同的文件修饰符。而且,这种情况下不需要表达。考虑以下内容
:
CREATE TABLE #NewFilename (FolderID int, FileID int, FileName varchar(40), Version int, FileModifier varchar(4) )
INSERT INTO #NewFilename VALUES(3506,16875,'Gadget.XLSX',1,'')
INSERT INTO #NewFilename VALUES(3506,16876,'Gadget.XLSX',2,'')
INSERT INTO #NewFilename VALUES(3506,16877,'Gadget.DOCX',1,'')
INSERT INTO #NewFilename VALUES(3506,16878,'Gadget.DOCX',2,'')
INSERT INTO #NewFilename VALUES(3522,17578,'Gadget.XLSX',1,'')
INSERT INTO #NewFilename VALUES(3522,17579,'Gadget.DOCX',1,'')
INSERT INTO #NewFilename VALUES(3525,17602,'Gadget.XLSX',1,'')
INSERT INTO #NewFilename VALUES(3525,17603,'Gadget.DOCX',1,'')
With DuplicateFileName As
(
Select FolderID, FileName
, DENSE_RANK() Over ( Partition By Filename Order By FolderID ) As Rnk
From #NewFilename
)
Update #NewFilename
Set FileModifier = '-' + Cast(Rnk As varchar(10))
From #NewFilename As T
Join DuplicateFileName As D
On D.FolderID = T.FolderID
select * from #NewFilename
order by FolderID