从版本控制的 EDM 系统重命名 table 中的重复文件?

Renaming duplicate files in a table from a version controlled EDM system?

我正在尝试重命名来自具有 300,000 行的 EDM 系统的 table 中的重复文件。我 运行 遇到的问题是数百个文件夹中有数千个重复的文件名,每个文件夹都有一个文件的多个版本。我需要创建唯一的文件名以导入到新系统中,因此我根据文件名和文件夹位置在文件扩展名 -1、-2、-3 等之前附加。

我想将第一个文件夹中文件名的初始实例及其所有版本附加为“-1”,将文件名的第二个实例及其在另一个文件夹中的版本附加为“-2”。我有文件 ID,可以用作发布附加的排序顺序,但顺序真的无关紧要。我提供了当前 table 结果的示例,以及嵌套在其中的所需结果。

到目前为止我想出的是:

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

而不是 ROW_NUMBER() 您需要使用 DENSE_RANK() 因为同一文件夹中的相同文件名可以具有相同的文件修饰符。并且不需要 CASE EXPRESSION。考虑以下

:


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